问题描述:
Canny 边缘检测的内部步骤是什么呢?噪声去除、计算图像梯度、非极大值抑制、滞后阈值。各个步骤的含义是什么呢?
问题解答:
Canny边缘检测算法主要包含以下几个步骤,每个步骤的具体含义如下:
-
噪声去除:
- 使用高斯滤波器对图像进行平滑处理,以减少噪声对边缘检测的影响。这一步骤可以有效降低图像中的随机噪声,使得后续步骤中检测到的边缘更加准确。
-
计算图像梯度:
- 通过使用Sobel算子或其他梯度算子计算图像的梯度幅值和方向。梯度幅值反映了图像亮度变化的强度,梯度方向指示了变化的方向。边缘通常对应于图像中梯度幅值较大的区域。
-
非极大值抑制:
- 在计算出梯度幅值和方向后,需要对每个像素进行检查,以去除那些不是局部最大值的点。这一步骤确保只有在梯度方向上是局部最大值的像素被保留下来,从而有效地细化边缘,减少边缘的宽度。
-
滞后阈值(Hysteresis Thresholding):
- 使用两个阈值(高阈值和低阈值)来确定边缘。首先,所有梯度幅值高于高阈值的像素被标记为边缘;然后,所有梯度幅值低于低阈值的像素被抑制。对于介于这两个阈值之间的像素,如果它们与已经标记为边缘的像素相邻,则也会被标记为边缘。这样可以有效连接边缘并消除孤立的边缘点。
通过以上步骤,Canny边缘检测能够精确检测出图像中的边缘,同时有效去除噪声和细化边缘。
代码:
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('roi.jpg',0)
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()