OpenCV边缘检测

古城微笑少年丶 2023-01-10 14:38 332阅读 0赞

梯度算子:是一阶导数算子,是水平G(x),G(y)方向对应模板的组合,也有对角线方向。

常见的一阶算子:

Roberts交叉算子,Rrewitt算子,Sobel算子

M\_\{x\}=












0 1
-1 0

M\_\{y\}=












1 0
0 -1

Roberts交叉算子是对角线方向的梯度算子,对应的水平方向和竖直方向的梯度分别为:

G\_\{x\}=f(x+1,y+1)-f(x,y), G\_\{y\}=f(x,y+1)-f(x+1,y)

Robert算子优缺点:

优点:边缘定位比较准,适用于边缘明显且噪声较少的图像。

缺点:没有描述水平和 竖直方向的灰度变化,只是关注了对角线方向,鲁棒性差,由于点本身参与了梯度计算,不能有效抑制噪声的干扰。

Sobel算子:

M\_\{x\}=



















-1 0 1
-2 0 2
-1 0 -1

M\_\{y\}=



















1 2 1
0 0 0
-1 -2 -1

G\_\{x\}=f(x+1,y+1)-f(x-1,y+1)+2f(x+1,y)-2f(x-1,y)+f(x+1,y-1)-f(x-1,y-1)

G\_\{y\}=f(x-1,y+1)-f(x-1,y-1)+2f(x,y+1)-2f(x,y-1)+f(x+1,y+1)-f(x+1,y-1)

Sobel算子引入了类似局部加权平均的运算,对边缘的定位比prewitt 算子好。

sobel算子函数:

dst=cv2.Sobel(src,ddepth,dx,dy,ksize)

参数说明:参数2:图像的深度,-1表示采用的与原图像相同写深度。目标图像的深度必须大于等于原图像的深度;

参数3,4.dx,dy表示的是求导的阶数,0表示这个方向上没有求导,一般为0,1,2

参数5:ksize是sobel算子的大小,必须为1,3,5,7.

  1. #Sobel算子练习
  2. import numpy as np
  3. import cv2
  4. from matplotlib import pyplot as plt
  5. img = cv2.imread('test.jpg',0)
  6. sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=5)
  7. sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=5)
  8. plt.subplot(1,3,1),plt.imshow(img,cmap = 'gray')
  9. plt.title('Original'),plt.xticks([]),plt.yticks([])
  10. plt.subplot(1,3,2),plt.imshow(sobelx,cmap = 'gray')
  11. plt.title('Sobel X'),plt.xticks([]),plt.yticks([])
  12. plt.subplot(1,3,3),plt.imshow(sobely,cmap = 'gray')
  13. plt.title('Sobel Y'),plt.xticks([]),plt.yticks([])
  14. plt.show()

梯度图结果:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dpbmdneW4_size_16_color_FFFFFF_t_70

Canny边缘检测算法

先平滑后求导。

评价边缘检测性能优劣的指标:

1好的信噪比,2高的定位性能,3虚假相应边缘应该得到最大抑制。

cv2.Canny(image,th1,th2,Size)

image:源图像

dth1:阈值1

th2:阈值2

Size:可选参数,Sobel算子的大小

步骤:

1彩色图像转换为灰度图像(以灰度图单通道图读入)

2对图像进行高斯模糊(去噪)

3计算图像梯度,根据梯度计算图像边缘幅值与角度

4沿梯度方向进行非极大值抑制(边缘细化)

5双阈值边缘连接处理

6二值化图像输出结果

  1. import cv2
  2. import numpy as np
  3. img = cv2.imread('test.jpg')
  4. v1 = cv2.Canny(img,80,150,(3,3))
  5. v2 = cv2.Canny(img,50,100,(5,5))
  6. ret = np.hstack((v1,v2))
  7. cv2.imshow('img',ret)
  8. cv2.waitKey(0)
  9. cv2.destroyAllWindows()

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dpbmdneW4_size_16_color_FFFFFF_t_70 1

实验测试用的原图:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dpbmdneW4_size_16_color_FFFFFF_t_70 2

发表评论

表情:
评论列表 (有 0 条评论,332人围观)

还没有评论,来说两句吧...

相关阅读

    相关 opencv边缘检测

        在讨论边缘算子之前,首先给出一些术语的定义:  (1)边缘:灰度或结构等信息的突变处,边缘是一个区域的结束,也是另一个区域的开始,利用该特征可以分割图像。  (2)

    相关 openCV实现图像边缘检测

    最近自己在做一个有关图像处理的小项目,涉及到图像的边缘检测、直线检测、轮廓检测以及角点检测等,本文首先介绍图像的边缘检测,使用的是Canny边缘检测算法,具体代码以及检测效果如