zoukankan      html  css  js  c++  java
  • 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)为一个彩色值。

  • 相关阅读:
    hdu2138(求素数)
    hdu2104
    poj1664(放苹果)
    数塔问题给你有哪些启示?
    汉诺塔问题(1)
    算法的力量(转李开复)
    最长子序列问题之系列一
    forward和redirect的区别
    group by 和having
    java中的多态三要素是什么?
  • 原文地址:https://www.cnblogs.com/wjgaas/p/3594050.html
Copyright © 2011-2022 走看看