opencv-02--图像的邻域操作

图像的邻域操作

很多时候,我们对图像处理时,要考虑它的邻域,比如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));
}

image

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

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

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

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

 

posted @ 2014-03-11 15:29  jianguo_wang  阅读(1189)  评论(0编辑  收藏  举报