图像的边缘检测
我們先看幾幅簡單的圖像:
這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與它們的區別在于,它是一個包含多個階段的算法。
我們用上面的代碼再看看有噪聲的情況。
可以看出,當有噪聲的時候,效果都很差。當然,這里都沒有事先進行圖像降噪。
總結
- 上一篇: 选择图像的“感兴趣区域”
- 下一篇: Hough直线检测的理解