
回复
图像梯度直观反应是图像当中各物体的轮廓,而在像素点上的体现其实就是相邻像素点之间的差值,差值越大,轮廓就会越清晰(可用于图像增强),边缘检测实际上就是对图像进行系统的梯度计算,包含了图像的噪声处理,非极大值抑制,双阈值检测等一系列图像处理方式,通过这些方式处理图像后得到图像的轮廓。这些方式在之前的博客都已经提到过了,而Opencv提供了一个非常方便的函数进行边缘检测,它将高斯滤波,梯度大小及方向计算,非极大值抑制,双阈值检测等几个边缘检测常用函数全部集成为一个函数,使用者只需要给出两个阈值的大小即可。
相关函数
cv2.Canny(XT_gray,minVal,maxVal):XT_gray为要进行处理的图像,而minVal是最小阈值,maxVal则是最大阈值。这两个参数可以自己设定,范围是0~255,而最小阈值表示如果检测到的梯度像素点小于最小阈值,那么它将会被舍去(即赋值为0),而介于最小阈值和最大阈值之间的梯度像素点,如果该像素点与边界相连,则将其保留为边界,否则同样舍去,而如果梯度像素点大于最大阈值,则直接将其认定为边界像素点,这样我们就舍去了图像模糊的部分,得到了图像明显的边界。
注意:在实际操作中,如果想要保留图像更多细节,则可以适当降低最小阈值,而反过来,如果想要简化图像,只想得到图像大体轮廓,则应该增大最小阈值。
代码示例
运行结果
原图
灰度图
不同阈值的对比图,可以看到,左边最小阈值较小的图像细节会比较明显,但是看起来轮廓就不太清晰了