zoukankan      html  css  js  c++  java
  • OpenCV几种边缘检测的简例

    简单记录一下OpenCV的几种边缘检测函数的用法。

    边缘检测算法
      以Sobel边缘检测算法为例。
      Sobel卷积核模板为:

    偏导公式为:

    Gx(i,j)=[f(i+1,j1)+2f(i+1,j)+f(i+1,j+1)][f(i1,j1)+2f(i1,j)+f(i1,j+1)]

    Gy(i,j)=[f(i1,j+1)+2f(i,j+1)+f(i+1,j+1)][f(i1,j1)+2f(i,j1)+f(i+1,j1)]

      卷积核模板的图片又是从网上抄来的,实际上我都不是很确定Gx,Gy有没有标反,但这不重要,只要知道了卷积核,就可以把核放到矩阵上一个一个的滑动,对应位置相乘,然后把这6(其实应该说是9个数,因为在Sobel算子的卷积核中有3个0,任何数乘以0都是0,所以可以不计算,但在其他算子就不见得都为0)个乘积相加,就分别得到了该坐标位置的Gx,Gy,这样一直滑到最后一个(我就是这么理解卷积的)。
      不过到这里其实还只是做了一半,因为还只是算出来了xy方向的偏导数。

      公式(8.1)是梯度向量,梯度幅值为用公式(8.2)。但在实际使用中,为了提高计算的速度,我们可以用式(8.3)、(8.4)(8.5)来近似。(8.6)是梯度向量的方向角公式。
      所以,在计算出(i,j)处的Gx(i,j),Gy(i,j)之后,可以用式(8.2)计算出图像的梯度幅值,或者用式(8.3)、(8.4)、(8.5)算出近似幅值后,设定一个阈值T,如果(i,j)处的幅值大于阈值T,则认为该点是边缘点。
      边缘检测大体都是这样,不同的算子只是卷积核不同。其实只要理解了图像数据是怎么进行卷积计算的,都可以自己设计算子,当然效果要好才有用。

    附上一个OpenCV的几个边缘检测函数的简单使用的栗子。

    #include "stdafx.h"
    
    #include "cv.h"
    #include "highgui.h"
    
    using namespace cv;
    
    int main(int argc, char* argv[])
    {
        Mat src = imread("F:\picture\cv53.jpg");
        Mat dst;
    
        //输入图像
        //输出图像
        //输入图像颜色通道数
        //x方向阶数
        //y方向阶数
        //Sobel(src,dst,src.depth(),1,1);
        //imwrite("sobel.jpg",dst);
    
        //输入图像
        //输出图像
        //输入图像颜色通道数
        //Laplacian(src,dst,src.depth());
        //imwrite("laplacian.jpg",dst);
    
        //输入图像
        //输出图像
        //彩色转灰度
        cvtColor(src,src,CV_BGR2GRAY);  //canny只处理灰度图
    
        //输入图像
        //输出图像
        //低阈值
        //高阈值,opencv建议是低阈值的3倍
        //内部sobel滤波器大小
        Canny(src,dst,50,150,3);    
        imwrite("canny71.jpg",dst);
    
        imshow("dst",dst);
        waitKey();
    
        return 0;
    }

      想测试那种边缘检测,就把注释修改一下即可。

  • 相关阅读:
    练习题
    作业2.6-2.15 两次作业
    11.13(2)
    11.13
    11.6
    10.30
    10.15
    10.9
    9.25号作业
    9.18号
  • 原文地址:https://www.cnblogs.com/betterwgo/p/6617281.html
Copyright © 2011-2022 走看看