1. 程式人生 > >基於FPGA的腐蝕膨脹算法實現

基於FPGA的腐蝕膨脹算法實現

靜態 art 數字 pan home 接收 blog 個人 沒有

本篇文章我要寫的是基於的腐蝕膨脹算法實現,腐蝕膨脹是形態學圖像處理的基礎,,腐蝕在二值圖像的基礎上做“收縮”或“細化”操作,膨脹在二值圖像的基礎上做“加長”或“變粗”的操作。那麽什麽是二值圖像呢?把一幅圖片看做成一個二維的數組,那麽二值圖像是一個只有0和1的邏輯數組,我們前面Sobel邊緣檢測後的圖像輸出邊緣效果,設置個閾值,大於閾值輸出為1,小於閾值輸出為0,最後輸出就是一幅二維圖像了。

上一篇我是直接用MATLAB處理後的灰度圖片進行Sobel邊緣檢測的,在圖片的選取中難免會有噪聲的出現,所以為了使邊緣檢測的效果更加顯著,我們將圖像先進行中值濾波,然後再進行Sobel邊緣檢測,最終加上腐蝕膨脹算法使圖像邊緣更加細膩並硬朗。

首先我們比較一下中值濾波前Sobel和中值濾波後Sobel兩種方法的顯示效果。

技術分享

中值濾波前Sobel

技術分享

中值濾波後Sobel

可以明顯的看出,中值濾波後Sobel的圖片邊緣更明顯,尤其是從lena頭發和帽子部分的顯示效果來看,很多多余的邊緣都被濾除掉,所以中值濾波後邊緣檢測,勢在必行。對於這部分的工程,我覺的應該沒什麽難度,中值濾波的代碼我已經給出,只需要在輸出時再加上Sobel就完事了。希望讀者能自己去做去調試搞定。

腐蝕算法

腐蝕是一種消除邊界點,使邊界向內部收縮的過程。可以用來消除小且無意義的物體。用3X3的結構元素,掃描圖像的每一個像素,用結構元素與其覆蓋的二值圖像做“與”操作,如果都為1,結果圖像的該像素為1。否則為0。結果會使二值圖像小一圈。

擬采用形象的比喻來說明該運算,且用0表示蛀蟲,1表示大米。蛀蟲腐蝕大米的過程便是腐蝕運算,技術分享

腐蝕

如圖所示,對於一個像素矩陣而言,因為有蛀蟲(0)的存在,所以將8顆大米(1)腐蝕掉了,即使只存在一個蛀蟲(0),但是還是會被蛀蟲腐蝕完畢,最後一幅圖上面由於沒有蛀蟲(0),固然大米一顆不懶,保存完好。

關於算法的實現,可以用下式子來表示,即3x3像素的運算:

P = P11 & P12 & P13 & P21 & P22 & P23 & P31 & P32 & P33

在HDL中,為了通過面積去換速度,我們將上式改變如下:

                                  P1 = P11 & P12 & P13

P2 = P21 & P22 & P23

P3 = P31 & P32 & P33

P = P1 & P2 & P3

如圖所示,即通過2個時鐘/步驟的運算,便能實現腐蝕運算的結果技術分享

腐蝕仿真

膨脹算法

膨脹是將與物體接觸的所有背景點合並到該物體中,使邊界向外部擴張的過程。可以用來填補物體中的空洞。用3X3的結構元素,掃描圖像的每一個像素,用結構元素與其覆蓋的二值圖像做“與”操作,如果都為0,結果圖像的該像素為0,。否則為1。結果:使二值圖像擴大一圈。

先腐蝕後膨脹的過程稱為開運算。用來消除小物體、在纖細點處分離物體、平滑較大物體的邊界的同時並不明顯的改變其面積。先膨脹後腐蝕的過程稱為比運算,用來填充物體內細小空間、連接鄰近物體、平滑其邊界的同時並不明顯改變其面積。

膨脹算法用最簡單的比喻來描述:0表示害蟲,1表示青蛙,青蛙吃了害蟲表示膨脹運算,我們用3*3像素陣列來解釋:技術分享

圖膨脹

如圖所示,圖左只有害蟲(0),所以害蟲都好好活著,中間那個圖,雖然只有一個害蟲,但是還是免不了被青蛙吃掉的命運,最右邊的那幅圖,都是青蛙,所以青蛙始終是青蛙。

關於算法的實現,可以用下式子來表示,即3x3像素的運算:

P = P11 || P12 || P13 || P21 || P22 || P23 || P31 || P32 || P33

在HDL中,為了通過面積去換速度,我們將上式改變如下:

                                   P1 = P11 || P12 || P13

P2 = P21 || P22 || P23

P3 = P31 || P32 || P33

P = P1 || P2 || P3

如圖所示,即通過2個時鐘/步驟的運算,便能實現腐蝕運算的結果技術分享

膨脹運算仿真

上面的仿真圖是我之前用Modelsim做的仿真,這裏就不重復用Isim仿真了。腐蝕膨脹用FPGA實現可以說是十分簡單的,將二值圖像生成3x3矩陣,最後通過如上式子計算,輸出即可。

技術分享

腐蝕

技術分享

膨脹

  從上面兩幅圖可以看出,腐蝕後的圖像邊緣明顯變細,消除了更多假邊緣,在腐蝕基礎上使用膨脹算法的lena將腐蝕後的邊緣擴大、加粗,這樣看起來更清楚,最終為我們後續圖像識別,作出了更好的準備工作。至此,腐蝕膨脹算法就寫完了,如果有什麽不足請您指點,有什麽問題大家可以留言一起討論,共同學習!

  如果你想獲得本文的所有課件,請關註本人的個人微信訂閱號:開源FPGANingHeChuan或掃描下方二維碼關註訂閱號,在後臺回復圖像處理,即可獲得本文的所有課件、資料以及更多FPGA的學習資料哦!

技術分享

轉載請註明出處:NingHeChuan(寧河川)

個人微信訂閱號:開源FPGANingHeChuan

如果你想及時收到個人撰寫的博文推送,可以掃描左邊二維碼(或者長按識別二維碼)關註個人微信訂閱號

知乎ID:NingHeChuan

微博ID:NingHeChuan

原文地址:http://www.cnblogs.com/ninghechuan/p/7574309.html

圖像處理系列文章

第一篇:基於FPGA的VGA顯示靜態圖片

第二篇:基於FPGA的RGB565_YCbCr_Gray算法實現

第三篇:基於FPGA的Uart接收圖像數據至VGA顯示

番外篇:數字圖像處理界標準圖像 Lena 後面的故事

第四篇:基於FPGA的均值濾波算法實現

第五篇:深刻認識shift_ram IP core——圖像處理學習筆記

第六篇:基於FPGA的中值濾波算法實現

第七篇:基於FPGA的Sobel邊緣檢測的實現

基於FPGA的腐蝕膨脹算法實現