【火爐煉AI】機器學習046-圖像邊緣的檢測方法
(本文所使用的Python庫和版本号: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 )
圖像中各種形狀的檢測時計算機視覺領域中非常常見的技術之一,特别是圖像中直線的檢測,圓的檢測,圖像邊緣的檢測等,下面我們來研究一下如何快速檢測圖像邊緣。
邊緣是不同區域的分界線,是周圍(局部)像素有顯著變化的像素的集合,有幅值與方向兩個屬性。這個不是絕對的定義,主要記住邊緣是局部特征以及周圍像素顯著變化産生邊緣。
常見邊緣檢測算子:Roberts 、Sobel 、Prewitt、Laplacian、Log/Marr、Canny、Kirsch、Nevitia
1. Sobel算子
Sobel算子是圖像邊緣檢測中最重要的算子之一,在機器學習中占有舉足輕重的作用,在技術上,它是一個離散的一階差分算子,用來計算圖像亮度函數的一階梯度之近似值。在圖像的任何一點使用此算子,将會得到該點對應的梯度矢量或法矢量。
在計算公式上,Sobel算子包含有兩組3*3的矩陣,分别為橫向及縱向,将這兩個矩陣與圖像做平面卷積,即可分别得到橫向及縱向的亮度差分近似值。所以這兩個算子,一個是檢測水平邊緣的,另一個是檢測垂直邊緣的,與Prewitt算子相比,Sobel算子對于像素的位置的影響做了加權,可以降低邊緣模糊程度,因此效果更好。
Sobel算子需要優化的地方可能隻有ksize一個參數了。ksize隻能去1,3,5,7這四個數字。
2. Laplacian算子
Laplacian算子是N維歐幾裡得空間中的一個二階微分算子,定義為梯度grad的散度div。此處不講解這個算子的計算和原理,隻講解使用方法和效果
# Laplacian算子進行圖像邊緣檢測 lap=cv2.Laplacian(image, cv2.CV_64F) plt.figure(12,figsize=(10,30)) plt.subplot(121) plt.imshow(image,cmap='gray') # 彩色圖像顯示異常,plt采用RGB模式,而cv2采用BGR模式 plt.title('raw_img') plt.subplot(122) plt.imshow(lap,cmap='gray') plt.title('Laplacian') 複制代碼
3. Canny算子
Canny的目标是找到一個最優的邊緣檢測算法,最有邊緣檢測的含義是:
1,好的檢測:算法能夠盡可能多的标識出圖像中的實際邊緣。
2,好的定位:标識出的邊緣要與實際圖像中的實際邊緣盡可能接近。
3,最小相應:圖像中的邊緣隻能标識一次,并可能存在的圖像噪聲不應标識為邊緣
為了滿足這些要求,Canny使用了變分法,這是一種尋找滿足特定功能的函數的方法,最優檢測使用四個指數函數項的和表示,但是它非常近似于高斯函數的一階導數。
Canny算法的步驟可以分為:降噪,尋找梯度,跟蹤邊緣。降噪是對原始圖像與高斯平滑模闆做卷積,得到的圖像與原始圖像相比有些輕微的模糊,這樣做的目的是單獨的像素噪聲在經過高斯平滑處理後就變得幾乎沒有影響。
尋找梯度:Canny算子使用4個mask檢測水平,垂直以及對角線方向的邊緣,原始圖像與每個mask所作的卷積都存儲起來。對于每個點我們都标識在這個點上的最大值以及生成的邊緣方向。這樣我們就從原始圖像生成了圖像中每個點亮度梯度圖以及亮度梯度的方向。
跟蹤邊緣:較高的亮度梯度比較有可能是邊緣,但是沒有一個确切的值來限定多大的亮度梯度是邊緣,所以canny使用滞後阈值--高阈值和低阈值。
上述步驟完成之後,我們就得到了一個二值圖,每點表示是否是一個邊緣點。
# Canny算子 canny = cv2.Canny(image, 50, 240) plt.figure(12,figsize=(10,30)) plt.subplot(121) plt.imshow(image,cmap='gray') # 彩色圖像顯示異常,plt采用RGB模式,而cv2采用BGR模式 plt.title('raw_img') plt.subplot(122) plt.imshow(canny,cmap='gray') plt.title('Canny') 複制代碼
Canny算子使用的一個難點在于高阈值和低阈值的選擇,其實對于任何阈值的選擇,都面臨一個兩難問題,設置的太高,可能會漏掉部分信息,設置的過低,會把噪聲當做重要信号來處理,這一點,倒是很像機器學習中的準确率和召回率的關系。
Canny算子适用于不同的場合,它的參數允許根據不同實現的特定要求進行調整以識别不同的邊緣特性。
########################小**********結###############################
1,此處講解的三個邊緣檢測算子,使用起來都比較簡單,比較難的是理解其内在本質含義。
2,從效果上來看,我個人比較傾向于Canny算子,因為從圖片中可以看出,其噪聲最少,得到的邊緣效果最好。
#################################################################
注:本部分代碼已經全部上傳到(我的github)上,歡迎下載。
參考資料:
1, Python機器學習經典實例,Prateek Joshi著,陶俊傑,陳小莉譯
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!