//方法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);
【opencv练习06-Scan图像の三种方法】
最新推荐文章于 2023-05-18 11:04:22 发布