python图形-canny边缘检测算法
canny边缘检测算法是一种流行的边缘检测算法,由John F. Canny in 发明,主要步骤如下:
1.高斯模糊降噪
2.使用Sobel filter计算图片像素梯度
3.NMS非最大值抑制计算局部最大值
4.Hysteresis thresholding 滞后阈值法过滤
其中canny的两个参数T_lower、T_upper就是这里的
----------------------------------------分割线
因为A点是高于阈值的,所以会被canny算法认为是真正的边界点。
C虽然低于最大值,但是它高于最小值,并且它和A相连,所以C也会被认为是边界点。
但是B会被抛弃,它不仅低于最大值,而且不和其他边缘点相连。
综上,选择合适的maxVal和minVal,对于能否得到好的结果非常重要!
代码:
import cv2 import numpy as np import matplotlib.pyplot as plt %matplotlib inline img = cv2.imread('./ng.png') img_fixed = cv2.cvtColor(img,cv2.COLOR_BGR2RGB) plt.imshow(img_fixed) edges1 = cv2.Canny(img.copy(),100,200) edges2 = cv2.Canny(img.copy(),50,200) edges3 = cv2.Canny(img.copy(),50,100) fig,(ax2,ax3,ax4) = plt.subplots(1,3,figsize=(20,8),sharex=True,sharey=True) ax2.axis('off') ax2.imshow(edges1,cmap='gray') ax3.axis('off') ax3.imshow(edges2,cmap='gray') ax4.axis('off') ax4.imshow(edges3,cmap='gray')
得到的结果:
结论:第一个图片,作为对比
第二个图片,把最小阈值调低,发现内部细节多了点
第三个图片,把最大阈值再调低,发现细节更多了!
在具体的操作上,多试试不同的参数,会慢慢找到需要的边缘。
接下来,会结合边缘检测,来做目标检测。