aihot  2017-05-08 16:04:23  OpenCV |   查看评论   
1);//下一行 11 uchar* cur_line=result.ptr<uchar>(i); 12 for(int j=1;j<nc-1;j++) 13 { 14 cur_line[j]=saturate_cast<uchar>(5*mid_line[j]-mid_line[j-1]-mid_line[j+1]- 15 up_line[j]-down_line[j]); 16 } 17 } 18 // 把图像边缘像素设置为0 19 result.row(0).setTo(Scalar(0)); 20 result.row(result.rows-1).setTo(Scalar(0)); 21 result.col(0).setTo(Scalar(0)); 22 result.col(result.cols-1).setTo(Scalar(0)); 23 }
OpenCV成长之路(2):图像的遍历

 

上面的程序有以下几点需要说明:

1,staturate_cast<typename>是一个类型转换函数,程序里是为了确保运算结果还在uchar范围内。

2,row和col方法返回图像中的某些行或列,返回值是一个Mat。

3,setTo方法将Mat对像中的点设置为一个值,Scalar(n)为一个灰度值,Scalar(a,b,c)为一个彩色值。

六、图像的算术运算

Mat类把很多算数操作符都进行了重载,让它们来符合矩阵的一些运算,如果+、-、点乘等。

下面我们来看看用位操作和基本算术运算来完成本文中的colorReduce程序,它更简单,更高效。

将256种灰度阶降到64位其实是抛弃了二进制最后面的4位,所以我们可以用位操作来做这一步处理。

首先我们计算2^8降到2^n中的n:int n=static_cast<int>(log(static_cast<double>(div))/log(2.0));

然后可以得到mask,mask=0xFF<<n;

用下面简直的语句就可以得到我们想要的结果:

result=(image&Scalar(mask,mask,mask))+Scalar(div/2,div/2,div/2);

很多时候我们需要对图像的一个通信单独进行操作,比如在HSV色彩模式下,我们就经常把3个通道分开考虑。

1 vector<Mat> planes; 2 // 将image分为三个通道图像存储在planes中
3 split(image,planes); 4 planes[0]+=image2; 5 // 将planes中三幅图像合为一个三通道图像
6 merge(planes,result);
 

除特别注明外,本站所有文章均为 赢咖4注册 原创,转载请注明出处来自OpenCV成长之路(2):图像的遍历

留言与评论(共有 0 条评论)
   
验证码:
[lianlun]1[/lianlun]