很多时候,我们对图像处理时,要考虑它的邻域,比如3*3是我们常用的,这在图像滤波、去噪中最为常见,下面我们介绍如果在一次图像遍历过程中进行邻域的运算。
下面我们进行一个简单的滤波操作,滤波算子为[0 –1 0;-1 5 –1;0 –1 0]。
它可以让图像变得尖锐,而边缘更加突出。核心公式即:sharp(i.j)=5*image(i,j)-image(i-1,j)-image(i+1,j)-image(i,j-1)-image(i,j+1)。
void ImgFilter2d(const Mat &image,Mat& result) { result.create(image.size(),image.type()); int nr=image.rows; int nc=image.cols*image.channels(); for(int i=1;i<nr-1;i++) { const uchar* up_line=image.ptr<uchar>(i-1);//指向上一行 const uchar* mid_line=image.ptr<uchar>(i);//当前行 const uchar* down_line=image.ptr<uchar>(i+1);//下一行 uchar* cur_line=result.ptr<uchar>(i); for(int j=1;j<nc-1;j++) { cur_line[j]=saturate_cast<uchar>(5*mid_line[j]-mid_line[j-1]-mid_line[j+1]- up_line[j]-down_line[j]); } } // 把图像边缘像素设置为0 result.row(0).setTo(Scalar(0)); result.row(result.rows-1).setTo(Scalar(0)); result.col(0).setTo(Scalar(0)); result.col(result.cols-1).setTo(Scalar(0)); }
上面的程序有以下几点需要说明:
1,staturate_cast<typename>是一个类型转换函数,程序里是为了确保运算结果还在uchar范围内。
2,row和col方法返回图像中的某些行或列,返回值是一个Mat。
3,setTo方法将Mat对像中的点设置为一个值,Scalar(n)为一个灰度值,Scalar(a,b,c)为一个彩色值。
opencv-02--图像的邻域操作,布布扣,bubuko.com
原文:http://www.cnblogs.com/wjgaas/p/3594050.html