zoukankan      html  css  js  c++  java
  • Filter2D卷积运算

    图像处理中的卷积运算一般都用来平滑图像、尖锐图像求边缘等等。主要看你选择什么样的核函数了。现在核函数很多,比如高斯平滑核函数,sobel核函数,canny核函数等等。这里举一个sobel核函数的例子来求图像的梯度。

    Sobel自动求边缘图(梯度图)在opencv里有特定的函数,具体参照opencv文档(需要自己设定阈值)。这里主要讲怎么用已知的sobel算子(核函数)去平滑当前图像。

    C++:void filter2D(InputArraysrc, OutputArray dst, int ddepth, InputArray kernel, Point anchor=Point(-1,-1), doubledelta=0,intborderType=BORDER_DEFAULT)

    这里要注意的是kerne,写的是单通道浮点型矩阵。

    Sobel核函数:

    按图一为例,kernel内核为:

    Mat kernelY=Mat::zeros(3,3,CV_32FC1);

            kernelY.at<float>(0,0)=1;

            kernelY.at<float>(0,1)=2;

            kernelY.at<float>(0,2)=1;

            kernelY.at<float>(1,0)=0;

            kernelY.at<float>(1,1)=0;

            kernelY.at<float>(1,2)=0;

            kernelY.at<float>(2,0)=-1;

            kernelY.at<float>(2,1)=-2;

            kernelY.at<float>(2,2)=-1;

    注意类型。我一开始写成CV_8Uuchar类型,filter2D卷积后就全是白色的。。

    然后就直接调用函数:

    filter2D(src,sobelY,-1,kernelY,Point(-1,-1),0.0,BORDER_DEFAULT);

     

    sobel函数是x,y方向的卷积的叠加,即:

    Sx和sy是两种内核卷积后的图像矩阵。M是最后的sobel梯度图。

    如果要直接用sobel函数,可以写成:

    Sobel(src,edge1,-1,1,0,3,1.0,0.0,4);//两个方向

    Sobel(src,edge2,-1,0,1,3,1.0,0.0,4);

    edge=abs(edge1)+abs(edge2); //也可以采用标准的平方根形式叠加

    两种方式最后得出的边缘图比较类似,个人感觉filter直接平滑的噪声更少。当然也可以认为检测出的'边缘点'(噪声点)个更少

    (sobel) (filter)

  • 相关阅读:
    RESTful
    Node.js Express 框架
    Node.js Web 模块
    Node.js Path 模块
    JavaFX输入并显示字符串
    JavaFX手眼协调小游戏(赋源代码)
    JavaFX作业七参考
    管理运筹学(Additional Simplex Algorithm)
    JavaFX15.4 ( 创建一个簡单的计算器 ) 编写一个程序完成加法、减法、乘法和除法操作
    JavaFX移动小球
  • 原文地址:https://www.cnblogs.com/Daringoo/p/4538131.html
Copyright © 2011-2022 走看看