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)

  • 相关阅读:
    基于 Docker 的 MySQL 主从复制搭建
    获取 Docker 容器的 IP 地址
    Maven 学习资料
    docker 中,修改了 mysql 配置,如何重启 mysql?
    TiDB 学习资料
    Sharding-JDBC 学习资料
    Druid(数据库连接池) 学习资料
    JWT 学习资料
    Maven 拥有三套相互独立的生命周期:clean、default、site
    Maven 生命周期的阶段与插件的目标之间的绑定关系
  • 原文地址:https://www.cnblogs.com/Daringoo/p/4538131.html
Copyright © 2011-2022 走看看