python-opencv-Canny边缘检测

Posted 天子骄龙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python-opencv-Canny边缘检测相关的知识,希望对你有一定的参考价值。

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()

效果图:

 

 

 

 

 

 

 

 

 

 

以上是关于python-opencv-Canny边缘检测的主要内容,如果未能解决你的问题,请参考以下文章

matlab图像如何用代码完成图像的分割、边缘检测和拼接的任务?

图像边缘检测基于matlab Zernike矩亚像素边缘检测含Matlab源码 1536期

OpenCV——Sobel边缘检测

OpenCV——Canny边缘检测

Matlab边缘检测问题

转载传统车道线检测-canny边缘检测-霍夫变换-完整代码(python)