OpenCV中有专门的Canny边缘检测算法的函数Canny(image,threshold1,threshold2,edges=None,apertureSize=None,L2gradient=None),我们可以直接调用它轻松实现图像的边缘检测。
但是Canny()函数内部并没有对图像进行很好地降噪,因此为了保证结果更准确,我们在调用Canny()函数前常常会先通过高斯滤波降噪。OpenCV中提供了
GaussianBlur(src,ksize,sigmax,dst=None,sigmaY=None,borderType=None)函数来实现高斯滤波器降噪
高斯滤波-高斯降噪:
import cv2 image = cv2.imread("1.png",1) image_info =image.shape height=image_info[0] width=image_info[1] gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) cv2.imshow('gray',gray) image_G=cv2.GaussianBlur(gray,(5,5),0) #高斯滤波-高斯降噪 ''' 参数1 src:必选参数。待处理的图像。它可以是单独的任意通道数的图像,但图片深度必须为CV_8U,CV_16U,CV_16S,CV_32F以及CV_64F之一 参数2 ksize:必选参数。高斯内核的大小。其中ksize.width和ksize.height可以不同,但他们都必须为正数和奇数或者它们都为零。【用来计算的像素点】 参数3 sigmaX:必选参数。表示高斯内核函数在X方向的的标准偏差。 参数4 可选参数。sigmaY: 高斯核函数在Y方向上的标准偏差,如果sigmaY是0,则函数会自动将sigmaY的值设置为与sigmaX相同的值,如果sigmaX和sigmaY都是0,这两个值将由ksize.width和ksize.height计算而来 ''' cv2.imshow("dst",image_G) cv2.waitKey()
效果图:
可以看到,经过高斯平滑滤波降噪后的图像会比原图像模糊,因此通常高斯滤波我们也叫高斯模糊。这种模糊技术生成的图像,其视觉效果就像是经过一个半透明屏幕在观察图像,其结果就是减少图像的噪声并降低细节层次。
import cv2 image = cv2.imread("wuhuan.jpg",1) image_info =image.shape height=image_info[0] width=image_info[1] gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) cv2.imshow('gray',gray) image_G=cv2.GaussianBlur(gray,(5,5),0) dst=cv2.Canny(image_G,50,50) #边缘检测 ''' 参数1 image:必选参数。表示原图像数组,即8位输入图像 参数2 threshold1:必选参数。用于设置最小阈值 参数3 threshold2:必选参数。用于设置最大阈值--用于进一步删选边缘信息
最后决定哪些是边缘,哪些是真正的边,哪些不是边。Canny边缘检测会设置两个阈值,我们称为高阈值(MaxVal)和低阈值(MinVal)。当像素点的幅值超过高阈值时,该像素点被保留为边缘像素;当像素点的幅值小于低闽值时,该像素点被排除;当像素点位于低阈值和高阈值之间时,只有当像素点连接一个超过高阈值的像素时才被保留。
'''
cv2.imshow("dst",dst) cv2.waitKey()
效果图: