OpenCV几种边缘检测的简例

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

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

20161025204901106

偏导公式为:

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,这样一直滑到最后一个(我就是这么理解卷积的)。
  不过到这里其实还只是做了一半,因为还只是算出来了 x y方向的偏导数。
20161025211813307

  公式(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;
}

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

转载于:https://www.cnblogs.com/betterwgo/p/6617281.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值