OpenCV几种边缘检测的简例

来源:互联网 发布:淘宝怎么下载数据包 编辑:程序博客网 时间:2024/05/22 19:26

简单记录一下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;}

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

0 0
原创粉丝点击