opencv图像处理之Canny边缘检测
程序员文章站
2024-01-28 09:04:46
...
文章目录
1.Canny检测背后的原理
【1】高斯平滑:去除噪声
由于边缘检测很容易受到噪声影响,所以第一步是使用5x5 的高斯滤波器去除噪声。
【2】sobel梯度计算:求梯度大小和方向
对平滑后的图像使用Sobel 算子计算水平方向和竖直方向的一阶导数(图像梯度)(Gx 和Gy)。根据得到的这两幅梯度图(Gx 和Gy)找到边界的梯度和方向,公式如下:
【3】非极大值抑制:
在获得梯度的方向和大小之后,应该对整幅图像做一个扫描,去除那些非边界上的点。对每一个像素进行检查,看这个点的梯度是不是周围具有相同梯度方向的点中最大的。
【4】滞后阈值:
max梯度以上的确定为边界。min梯度以下的不算边界。max和min梯度之间的,和max以上梯度的像素相连的才算边界。
2.代码和结果展示
- cv2.Canny()
- cv2.createTrackbar()
- cv2.getTrackbarPos()
参数解释:
edges = cv2.Canny(test, min, max)
#参数1:输入图像,参数2:minValue,参数3:maxValue
cv2.createTrackbar('min','image',0,200,nothing)
#参数1:slider名字,参数2:显示窗口的名字,3:滑动条默认值,4:滑动条最大值,5:回调函数,默认参数为滑动条的位置x
max=cv2.getTrackbarPos('max','image')
#参数1:slider名字,2:显示窗口的名字。返回值:滑动条的位置。
以下代码实现了用滑动条控制min和max来改变边缘检测的效果:
def nothing(x):
pass
def canny(self):
test=cv2.imread('../images/test2.jpg',0)
cv2.namedWindow('image')
cv2.createTrackbar('min','image',0,200,nothing)
cv2.createTrackbar('max','image',100,300,nothing)
while(1):
min=cv2.getTrackbarPos('min','image')
max=cv2.getTrackbarPos('max','image')
edges = cv2.Canny(test, min, max)
cv2.imshow('image',edges)
k=cv2.waitKey(1)&0xFF
if k==27:
break
上一篇: 边缘检测 - Sobel算子
推荐阅读
-
Canny图像边缘检测
-
Android OpenCV 边缘检测 Canny 的使用
-
【图像处理】——Python霍夫变换之直线检测(主要是两个函数Houghlines&HoughlinesP)
-
【图像处理】——Python图像分割边缘检测算法之二阶梯度算子(laplace、log、dog算子)
-
图像边缘检测——基于OpenCV的canny边缘检测
-
图像边缘检测 Canny边缘检测
-
opencv——图像边缘检测(上)sobel算子
-
OpenCV图像边缘检测(Canny算法)
-
python+opencv+图像特效(图像灰度处理、颜色翻转、图片融合,边缘检测,浮雕效果,颜色映射)
-
【opencv学习笔记】020之边缘检测与Canny算子