Opencv之边缘检测Canny算法

Canny Edge Detection(Canny 边缘检测)

1、Theory

Canny边缘检测算子是一种多级检测算法。1986年由John F. Canny提出,同时提出了边缘检测的三大准则:

A、低错误率的边缘检测:检测算法应该精确地找到图像中的尽可能多的边缘,尽可能的减少漏检和误检。

B、最优定位:检测的边缘点应该精确地定位于边缘的中心。

C、图像中的任意边缘应该只被标记一次,同时图像噪声不应产生伪边缘。

该算法步骤简介:

步骤一:Noise Reduction(去噪,比如用Gaussian filter)

步骤二:Finding Intensity Gradient of the Image(找最大的梯度值)

步骤三:Non-maximum Suppression(去除非极大值)

解析:比如A是边界上的一点(在竖直方向上),点C和点B是点A的梯度方向,如果点A被构成一个局部最大值,则进行下面一步,否则被忽略(比如置零)

步骤四:Hysteresis Thresholding(双阈值,用来确定真真的图像边界)

解析:从上图,设置了两个阈值,一个为maxVal,一个为minVal,其中边A位于最大值之上,我们认为边A是真真的边界边,边C位于最大阈值之下,但是和边A连接一个完整的曲线,我们认为边C也是有效边界,但是边B,和边C一样在最大值之下,最小值之上,但是没有和任何一条真真的边界边,所以该边去掉。

 

2、Canny Edge Detection in OpenCV

函数cv2.Canny()

函数原型

Canny(InputArray image,OutputArray edges,double threshold1,double threshold2,int apertureSize = 3,bool L2gradient = false )

参数解析

image       8-bit input image.

edges       output edge map; single channels 8-bit image, which has the same size as image .

threshold1        first threshold for the hysteresis procedure.

threshold2        second threshold for the hysteresis procedure.

apertureSize    aperture size for the Sobel operator.

L2gradient        a flag, indicating whether a more accurate L2 norm =(dI/dx)2+(dI/dy)2√ should be used to calculate the image gradient magnitude ( L2gradient=true ), or whether the default L1 norm =|dI/dx|+|dI/dy| is enough ( L2gradient=false ).  默认值为false

import cv2
from matplotlib import pyplot as plt
img = cv2.imread('../../image/dushu2.jpg',0)
edges = cv2.Canny(img,100,200)  // canny算法
plt.subplot(121),plt.imshow(img,cmap = 'gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(edges,cmap = 'gray')
plt.title('Edge Image'), plt.xticks([]), plt.yticks([])
plt.show()

思考:图像处理中有多种边缘检测(梯度)算子,基于寻找梯度强度的算子有:普通一阶差分,Robert算子(交叉差分),Sobel算子等;基于过零点检测的算子有:拉普拉斯算子(二阶差分)。这些算子对图像检测有什么特别点,后续对这些算子梳理一下。

3、Reference Materials

资料1:http://docs.opencv.org/3.3.0/da/d22/tutorial_py_canny.html

资料2(Canny函数):

http://docs.opencv.org/3.3.0/dd/d1a/group__imgproc__feature.html#ga04723e007ed888ddf11d9ba04e2232de

资料3:Canny边缘检测算法原理及其VC实现详解(一)

http://blog.csdn.net/likezhaobin/article/details/6892176

资料4:Canny边缘检测算法原理及其VC实现详解(二)

http://blog.csdn.net/likezhaobin/article/details/6892629

资料5:Canny边缘检测算法的实现

http://www.cnblogs.com/mightycode/p/6394810.html

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: