OpenCv-Python学习笔记(十):Canny边缘检测

目录

demo

原理

噪声去除

计算图像梯度

非极大值抑制

滞后阈值

demo

cv2.Canny()函数:用于边缘检测。

第一个参数表示输入图像。

第二个参数表示滞后过程中的第一个阈值,计算出的边界点大于这个阈值才是真正边界

第三个参数表示滞后过程中的第二个阈值,计算出的边界点低于这个阈值被抛弃

具体滞后过程中的两个阈值见原理部分说明。

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('../data/image/2.jpeg')
#边缘检测
edges = cv2.Canny(img,100,200)
#显示原图
plt.subplot(121),plt.imshow(img,cmap = 'gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
#显示边缘检测后的图
plt.subplot(122),plt.imshow(edges,cmap = 'gray')
plt.title('Edge Image'), plt.xticks([]), plt.yticks([])
plt.show()

OpenCv-Python学习笔记(十):Canny边缘检测_第1张图片 

原理

Canny边缘检测是有John F.Canny在1986年提出的,它有噪声去除、计算图像梯度、非极大值抑制和滞后阈值组成。

噪声去除

由于边缘检测很容易受到噪声影响,所以第一步是使用5*5的高斯低通滤波器去除噪声,参见我之前的文章:OpenCv-Python学习笔记(八):图像平滑(图像模糊)_笨鸟未必先飞的博客-CSDN博客

计算图像梯度

对平滑后的图像使用Sobel算子计算水平方向和竖直方向的一阶导数(图像梯度)(Gx和Gy),根据这两幅梯度图(Gx和Gy)找到边界的梯度和方向,公式如下:

OpenCv-Python学习笔记(十):Canny边缘检测_第2张图片

 梯度的方向一般总是与边界垂直。梯度方向被归为四类:垂直,水平和两个对角线。

非极大值抑制

在获得梯度的方向和大小之后,应该对整幅图像做一个扫描,去除那些非边界上的点。对每一个像素进行检查,看这个点的梯度是不是周围具有相同梯度方向的点中最大的。

OpenCv-Python学习笔记(十):Canny边缘检测_第3张图片

 

滞后阈值

现在要确定哪些边界才是真正的边界,这时我们需要设置两个阈值:minVal和maxVal。当图像的灰度梯度高于maxVal被认为是真正的边界,那么低于minVal的边界会被抛弃。如果介于两者直接,就要看这个点是否与某个被确定为真正的边界点相连,如果是就认为它也是边界点,如果不是就抛弃。

OpenCv-Python学习笔记(十):Canny边缘检测_第4张图片

A高于阈值maxVal所以是真正的边界,C虽然低于maxVal但高于minVal并且与A相连,所以也被认为是真正的边界点。而B就会被抛弃,因为他不仅低于maxVal而且不与真正的边界点相连。

 

你可能感兴趣的:(OpenCv-python,opencv,python,学习)