您的位置:首页 > 运维架构

【opencv练习06-Scan图像の三种方法】

2016-08-25 23:40 295 查看
//方法1【高效方式】*****************************************

//压缩颜色值
uchar* p;
for( int i = 0; i < nRows; ++i)        //指针每一行
{
p = I.ptr<uchar>(i);        //p指向,第i行的地址
for( int j = 0; j < nCols; ++j)
{
p[j] = table[p[j]];        //修改i行的j元素颜色值
}
}
return I;

//方法2【安全方式,迭代器】*****************************************
**单通道——uchar
三通道——Vec3b**
switch(channels)     (http://img.blog.csdn.net/20160825234022144)
{
case 1:
{
for(int i=0; i<I.rows; ++i )
for(int j=0; j< I.cols; ++j)
I.at<uchar>(i,j) = table[I.at<uchar>(i,j)];
break;
}
case 3:
{
Mat_<Vec3b> _I = I;
for(int i=0; i<I.rows; ++i )
for(int j=0; j< I.cols; ++j)
{
_I(i,j)[0] = table[_I(i,j)[0]];
_I(i,j)[1] = table[_I(i,j)[1]];
_I(i,j)[2] = table[_I(i,j)[2]];
}
I = _I;
break;
}
}
return I;

//方法3【动态地址计算】*****************************************

switch(channels)
{
case 1:
{
MatIterator_<uchar> it,end;
for( it = I.begin<uchar>(), end = I.end<uchar>(); it != end; ++it)//初始化,条件++
*it = table[*it];                //迭代器访问
break;
}
case 3:
{
MatIterator_<Vec3b> it,end;
for( it = I.begin<Vec3b>(), end = I.end<Vec3b>(); it != end; ++it)
{
(*it)[0] = table[(*it)[0]];
(*it)[1] = table[(*it)[1]];
(*it)[2] = table[(*it)[2]];
}
}
}
return I;

//方法4【库实现】*****************************************
Mat lookUpTable(1, 256, CV_8U);
uchar* p = lookUpTable.data;
for(int i = 0; i < 256; ++i)
p[i] = table[i];

Mat out_image4 = image.clone();
LUT(image, lookUpTable,out_image4);


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息