什么是Canny边缘检测
Canny边缘检测是一种使用多级边缘检测算法检测边缘的方法。该方法由John F. Canny于1986年发表。
Canny边缘检测主要分为4个步骤:
(1)去噪。噪声会影响边缘检测的准确性,因此首先要将噪声过滤掉。
(2)计算梯度的幅度与方向
(3)非极大值抑制,即适当地让边缘“变瘦”。
(4)确定边缘。使用双阈值算法确定最终的边缘信息。
在实际的图像边缘检测中,我们一般先用高斯滤波去除图像噪声(1),然后计算梯度的幅度与角度两个值(2),接着遍历图像中的像素点,去除所有非边缘的点(3)。最后,去除噪声所产生的虚边缘得到最终的边缘信息。(4)
在OpenCV中,它给我们提供了cv2.Canny()函数用于Canny边缘检测,其完整定义如下:
def Canny(image, threshold1, threshold2, edges=None, apertureSize=None, L2gradient=None):
image:8位输入图像
threshold1:处理过程中的第一个阈值
threshold2:处理过程中的第二个阈值
edges:计算得到的边缘图像
apertureSize:Sobel滤波器的孔径大小
L2gradient:计算图像梯度幅度的标识。它是一个布尔类型,默认值为False。如果为True,则使用更精确的L2范数进行计算,也就是两个方向的导数的平方和再开方,否则使用L1范数(直接将两个方向导数的绝对值相加),数学公式如下:
获取图像的边缘
既然我们已经了解了其方法的定义,以及具体的实现原理。下面,我们来通过一段程序获取图像的边缘信息,具体代码如下所示:
import cv2 img = cv2.imread("4.jpg", cv2.IMREAD_UNCHANGED) result1=cv2.Canny(img,100,200) result2=cv2.Canny(img,30,90) cv2.imshow("img", img) cv2.imshow("result1", result1) cv2.imshow("result2", result2) cv2.waitKey() cv2.destroyAllWindows()
运行之后,得到的效果如下图所示:
可以看到,Canny边缘检测获取到的图像信息与抖音酷炫的人物轮廓分离实现的效果几乎一样。没错,其实抖音那种酷炫的人物轮廓分离特效,就可以使用Canny边缘检测实现。