我们先看几幅简单的图像:
这3幅图像,都只有极其简单的线条,组成了物体的轮廓,我们“人”一看就知道是什么物体。也就是说,我们人类视觉通过物体边缘就能够做到识别物体。因此,物体边缘是图像中最基本也是最重要的特征,图像识别、理解的第一步就是边缘检测。
那么,什么是边缘呢?很遗憾,尽管边缘在图像处理中有着极其重要的作用,但好像并没有严格精确的定义。一般认为:两个具有不同灰度的均匀图像区域的边界称为边缘。沿边缘方向的灰度变化比较平缓,而边缘法线方向的灰度变化比较剧烈。
对于边缘检测,我们并不陌生,在前面的文章中,提到了图像的一阶微分和二阶微分。当时是用一阶微分和二阶微分来增强图像。但是,本质上,一阶微分和二阶微分计算的就是灰度的变化情况。而边缘恰恰也就是灰度变化的地方。
因此,这些传统的一阶微分算子如Robert、Sobel、prewitt等,以及二阶微分算子Laplacian等等本质上都是可以用于检测边缘的。这些算子都可以称为边缘检测算子。
我们动手感受下几个边缘检测算子的效果:
import cv2
lenna = cv2.imread("images\\lenna.png", 0)
sobel = cv2.Sobel(lenna, -1, 1, 1, ksize=5)
laplacian = cv2.Laplacian(lenna, -1)
canny = cv2.Canny(lenna, 100, 200)
cv2.imshow("sobel", sobel)
cv2.imshow("laplacian", laplacian)
cv2.imshow("canny", canny)
cv2.waitKey()
当然,sobel和laplacian只能算做是一种边缘检测算子,还算不上是一种边缘检测算法。canny与它们的区别在于,它是一个包含多个阶段的算法。
我们用上面的代码再看看有噪声的情况。
可以看出,当有噪声的时候,效果都很差。当然,这里都没有事先进行图像降噪。