Opencv2.4学习::边缘检测(5)Canny算法 - Go语言中文社区

Opencv2.4学习::边缘检测(5)Canny算法


边缘检测

1、Sobel

2、Laplace

3、Roberts

4、Canny


Canny

canny对边缘检测质量进行分析时,有3个原则:

  • 1、信噪比准则
  • 2、定位精度准则
  • 3、单边缘响应准则        

canny边缘检测的基本思想是:首先对图像选择一定的Gauss滤波器进行平滑滤波,然后采用非极值抑制技术进行处理得到最后的边缘图像。

 

Canny算法基本可分为4个步骤:


步骤一:

  • 滤波平滑噪声。

GaussianBlur(src,dst,Size(3,3),1.5,1.5);

 


步骤二:

  • 利用已有的一阶偏导算子计算梯度。一般用sobel


步骤三:


 步骤四:

  • 双阈值法抑制假边缘,连接真边缘 


核心函数:

void Canny(InputArray image,OutputArray edges, double threshold1, double threshold2, int apertureSize=3,bool L2gradient=false )
  • InputArray类型的image,输入图像,即源图像,填Mat类的对象即可,且需为单通道8位图像。
  • OutputArray类型的edges,输出的边缘图,需要和源图片有一样的尺寸和类型。
  • double类型的threshold1,第一个滞后性阈值【低阈值】。值越大,找到的边缘越少
  • double类型的threshold2,第二个滞后性阈值【高阈值】。
  • int类型的apertureSize,表示应用Sobel算子的孔径大小,其有默认值3。
  • bool类型的L2gradient,一个计算图像梯度幅值的标识,有默认值false。

低于阈值1的像素点会被认为不是边缘;

高于阈值2的像素点会被认为是边缘;

在阈值1和阈值2之间的像素点,若与第2步得到的边缘像素点相邻,则被认为是边缘,否则被认为不是边缘。


调用代码: 

#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
void main()
{
	Mat srcImage = imread("F:\opencv_re_learn\2.jpg");
	if (!srcImage.data){
		cout << "falied to read" << endl;
		system("pause");
		return;
	}
	Mat srcGray;
	cvtColor(srcImage, srcGray, CV_BGR2GRAY);
	//高斯滤波
	GaussianBlur(srcGray, srcGray, Size(3, 3),
		0, 0, BORDER_DEFAULT);
	//Canny检测
	int edgeThresh =100;
	Mat Canny_result;
	Canny(srcImage, Canny_result, edgeThresh, edgeThresh * 3, 3);
	imshow("src", srcImage);
	imshow("Canny_result", Canny_result);
	waitKey(0);
}

实现效果:

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/dieju8330/article/details/82814529
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-06-28 01:37:07
  • 阅读 ( 2115 )
  • 分类:算法

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢