对比图像增强前后使用canny算子的效果,以及使用sobel算子二阶导数的效果:
import cv2
import matplotlib.pyplot as plt
#canny算子
'''
步骤:
1、彩色图像转换为灰度图像统一梯度
2、高斯滤波,滤除噪声点
3、高亮处理,增强图像梯度对比
4、形态学操作,填补图像漏洞,连接断线
5、canny算子提取边缘
5.1、通过sobel算子计算图像梯度,根据梯度计算边缘幅值与角度
5.2、非极大值抑制,相当于求取二阶导
5.3、双阈值边缘连接处理
6、二值化图像输出结果
'''
#1.原图转灰度图
img=cv2.imread(r"img.jpg",0)
#2.高斯模糊处理
GaussianBlur=cv2.GaussianBlur(img,(9,9),3)
# 3.高亮处理,增强差异度/梯度
ScaleAbs=cv2.convertScaleAbs(GaussianBlur,alpha=8,beta=0)
#4.形态学闭操作填补漏洞
kerner=cv2.getStructuringElement(cv2.MORPH_RECT,(9,9))
MORPH_CLOSE=cv2.morphologyEx(ScaleAbs,cv2.MORPH_CLOSE,kerner)
#5.canny算子提取边缘
# 通过sobel算子计算图像梯度,根据梯度计算边缘幅值与角度
# 非极大值抑制
# 双阈值边缘连接处理
Canny1=cv2.Canny(img,100,150)
Canny2=cv2.Canny(MORPH_CLOSE,100,150)
#sobel算子
sobelX=cv2.Sobel(MORPH_CLOSE,-1,dx=2,dy=0,ksize=5)
sobelY=cv2.Sobel(MORPH_CLOSE,-1,dx=0,dy=2,ksize=5)
#增强梯度
sobelXABS=cv2.convertScaleAbs(sobelX,1,1)#src*alpha+beta,计算绝对值,将结果转成8位
sobelYABS=cv2.convertScaleAbs(sobelY,1,1)#src*alpha+beta,计算绝对值,将结果转成8位
#x轴和y轴的梯度权重各占一半
soble=cv2.addWeighted(sobelXABS,0.5,sobelYABS,0.5,0)
# 6.边缘二值化处理
ret1,thresh1=cv2.threshold(Canny1,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)
ret2,thresh2=cv2.threshold(Canny2,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)
#展示最终结果
plt.subplot(231),plt.imshow(img,cmap="gray"),plt.title("img"),plt.xticks([]),plt.yticks([])
plt.subplot(232),plt.imshow(ScaleAbs,cmap="gray"),plt.title("ScaleAbs"),plt.xticks([]),plt.yticks([])
plt.subplot(233),plt.imshow(thresh1,cmap="gray"),plt.title("thresh1"),plt.xticks([]),plt.yticks([])
plt.subplot(234),plt.imshow(thresh2,cmap="gray"),plt.title("thresh2"),plt.xticks([]),plt.yticks([])
plt.subplot(235),plt.imshow(soble,cmap="gray"),plt.title("soble"),plt.xticks([]),plt.yticks([])
plt.show()
找了装甲车照片实践,效果不理想。