首页 > 编程知识 正文

python图像边缘opencv,python代码

时间:2023-05-05 01:11:36 阅读:12460 作者:2218

在此列出几篇参考的文章:

33559 www.Jian Shu.com/p/2a 06c 68f6c 14

3359 blog.csdn.net/sunny 2038/article/details/9170013

3359 blog.csdn.net/sunny 2038/article/details/9202641

3359 blog.csdn.net/sunny 2038/article/details/9188441

边缘检测(边缘提取)是一种图像滤波,最常用的主要有Sobel算子、Laplacian算子和Canny算子三种。

1、Sobel算子Sobel算子检测方法对灰度渐变和高噪声图像处理效果较好,Sobel算子边缘定位不准确,图像边缘为多个像素; 在对精度要求不高的情况下,是比较常用的边缘检测方法。 有方向了。

图片源于网络

图片源于网络

图片源于网络

图片源于网络

在opencv-python中,Sobel操作符的主函数代码如下:

DST=cv2.Sobel(src,ddepth,dx,dy[,dst[,ksize[,scale[,delta[,borderType]]]]] ) ) )前四个是必需的参数

第一个参数是需要处理的图像; 第二个参数是图像深度,-1表示使用的深度与原始图像相同。 目标图像的深度必须大于或等于原始图像的深度。 dx和dy表示求导的次数,0表示没有向这个方向求导,一般为0、1、2。 后面是可选参数:

dst是输出图像; ksize是Sobel运算符的大小,必须为1、3、5和7。 scale是比例导数的比例常数,缺省情况下没有伸缩系数。 增量是可选的增量,将添加到最终的dst中。 同样,缺省情况下dst没有其他值。 边框类型是判断图像边界的模式。 此参数的默认值为cv2.BORDER_DEFAULT。 总体代码如下:

# coding=utf-8 import c v2 importnumpyasnpimg=cv2.im read (' d :/lion.jpg ',0 ) x=cv2.sobel ) img, cv2.cv 1 ) absY=cv2.convertscaleabs(x ) uint8absy=cv2.convertscaleabs (y ) dst=cv2.addWeighted ) absx,0. absY absX ) cv2.imshow(absY )、absy ) cv2.im show (result )、dst ) cv2.waitKey(0)0) cv2.destroyAllWindows ) ) 也就是说,Sobel函数在求解导数时具有负值,并且具有大于255的值。 由于原始图像是uint8,即8位无符号数,因此Sobel创建的图像位数不足,存在截断。 因此,使用名为cv2.CV_16S的16位有符号数据类型。

处理后,请不要忘记使用convertScaleAbs ()函数恢复为原始的uint8格式。 否则,不显示图像,而是灰色窗口。 convertScaleAbs () )的原型如下:

DST=cv2.convertscaleabs(src[,dst[,alpha [,beta ] ) )其中alpha是可选参数,beta是要添加到结果中的值。 结果返回uint8类型的图像。

因为Sobel运算符是双向计算的,所以最后必须用cv2.addWeighted (. )函数组合。 函数的原型如下

DST=cv2.addWeighted(src1,alpha,src2,beta,gamma [,dst[,dtype]] ),其中alpha是第一个图像元素的权重,beta是第二个权重,gammma是

2、Canny算子Canny方法不易受噪声干扰,能检测出真正的弱边缘。 具有如下优点:分别用两种不同的阈值检测强边缘和弱边缘,在弱边缘与强边缘连接的情况下,输出图像中可包含弱边缘。

Canny边缘检测算法分为以下五个步骤:

1 )使用yqdmd滤波器来平滑图像并去除噪声。

2 )计算图像内各像素点的梯度强度和方向。

3 )应用极大值以外的值(Non-Maxim

um Suppression)抑制,以消除边缘检测带来的杂散响应。

4)        应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。

5)        通过抑制孤立的弱边缘最终完成边缘检测。

在施加非极大值抑制之后,剩余的像素可以更准确地表示图像中的实际边缘。然而,仍然存在由于噪声和颜色变化引起的一些边缘像素。为了解决这些杂散响应,必须用弱梯度值过滤边缘像素,并保留具有高梯度值的边缘像素,可以通过选择高低阈值来实现。如果边缘像素的梯度值高于高阈值,则将其标记为强边缘像素;如果边缘像素的梯度值小于高阈值并且大于低阈值,则将其标记为弱边缘像素;如果边缘像素的梯度值小于低阈值,则会被抑制。阈值的选择取决于给定输入图像的内容。

被划分为强边缘的像素点已经被确定为边缘,因为它们是从图像中的真实边缘中提取出来的。然而,对于弱边缘像素,将会有一些争论,因为这些像素可以从真实边缘提取也可以是因噪声或颜色变化引起的。为了获得准确的结果,应该抑制由后者引起的弱边缘。通常,由真实边缘引起的弱边缘像素将连接到强边缘像素,而噪声响应未连接。为了跟踪边缘连接,通过查看弱边缘像素及其8个邻域像素,只要其中一个为强边缘像素,则该弱边缘点就可以保留为真实的边缘。

Canny的输入是经过灰度化的单通道图。

在opencv-python中,Canny算子的主函数代码为:

edge = cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient ]]])

必要参数:

第一个参数是需要处理的原图像,该图像必须为单通道的灰度图;第二个参数是阈值1;第三个参数是阈值2。

其中较大的阈值2用于检测图像中明显的边缘,但一般情况下检测的效果不会那么完美,边缘检测出来是断断续续的。所以这时候用较小的第一个阈值用于将这些间断的边缘连接起来。

可选参数中apertureSize就是Sobel算子的大小,默认为3。而L2gradient参数是一个布尔值,如果为真,则使用更精确的L2范数进行计算(即两个方向的倒数的平方和再开放),否则使用L1范数(直接将两个方向导数的绝对值相加)。

函数返回一副二值图,其中包含检测出的边缘。

完整代码为:

#coding=utf-8import cv2import numpy as np img = cv2.imread("D:/lion.jpg", 0) img = cv2.GaussianBlur(img,(3,3),0) #用yqdmd平滑处理原图像降噪。canny = cv2.Canny(img, 50, 150) #最大最小阈值 cv2.imshow('Canny', canny)cv2.waitKey(0)cv2.destroyAllWindows() 3、Laplacian算子

Laplacian算子是一种二阶微分算子。对噪声比较敏感,所以很少用该算子检测边缘,而是用来判断边缘像素视为与图像的明区还是暗区。拉普拉斯yqdmd算子是一种二阶导数算子,将在边缘处产生一个陡峭的零交叉, Laplacian算子是各向同性的,能对任何走向的界线和线条进行锐化,无方向性。这是拉普拉斯算子区别于其他算法的最大优点。

在opencv-python中,Laplacian算子的主函数代码为; 

dst = cv2.Laplacian(src, ddepth[, dst[, ksize[, scale[, delta[, borderType]]]]])

参数的含义类似于sobel算子:

前两个是必须的参数:

第一个参数是需要处理的图像;第二个参数是图像的深度,-1表示采用的是与原图像相同的深度。目标图像的深度必须大于等于原图像的深度;

其后是可选的参数:

dst不用解释了;ksize是算子的大小,必须为1、3、5、7。默认为1。scale是缩放导数的比例常数,默认情况下没有伸缩系数;delta是一个可选的增量,将会加到最终的dst中,同样,默认情况下没有额外的值加到dst中;borderType是判断图像边界的模式。这个参数默认值为cv2.BORDER_DEFAULT。

完整代码为:

#coding=utf-8import cv2import numpy as np img = cv2.imread("D:/lion.jpg", 0) gray_lap = cv2.Laplacian(img,cv2.CV_16S,ksize = 3)dst = cv2.convertScaleAbs(gray_lap) cv2.imshow('laplacian',dst)cv2.waitKey(0)cv2.destroyAllWindows()

也可以像canny算子中的代码一样,先经过一些滤波来降噪,然后再做边缘检测。


 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。