本文主要對二值圖像膨脹的定義、原理以及VC下實現方法進行總結,並通過圖像處理結果對圖像膨脹操作的功能以及使用場合進行討論。
1、定義
參考岡薩雷斯的經典教材,對Z空間中的集合A和B,使用B對A進行膨脹,可定義爲:
可以理解膨脹過程爲:首先得到膨脹結構元素相對於自身原點(按照本人的理解,對於對稱的結構元素,原點爲其對稱中心,對於非對稱的結構元素,原點由工程師根據相應的應用制定)的映射,然後根據此映射的z平移,如果結構元素的映射與集合A交集非空,則z屬於膨脹後的集合。
按照本人的理解,這個定義的意思就是從圖像的第一個像素點開始依行遍歷全部像素,在每個像素點上,移動結構元素B的映射的中心與其重合,然後判斷此位置的結構元素是否有對A集合的覆蓋,如果有,則保留這個點,否則對此點取反(按照如下的符號約定,即將改點灰度值設置爲0)。
2、灰度值及邏輯約定
1)二值圖像中,所有黑色像素的集合是圖像完整的形態學描述
2)對於二值化後的圖像:黑色表示灰度爲0,白色表示灰度爲255
3)對於形態學結構元素:黑色代表1,白色表示0
4)值爲1的點組成完整的形態學結構元素
3、VC實現灰度圖的二值膨脹
首先貼上代碼,然後再進行說明。作者實現的代碼如下:
- /*************************************************************************
- *
- * \函數名稱:
- * DilationAlgorithm()
- *
- * \輸入參數:
- * pGrayMat: 二值圖像數據
- * pErosionMat: 輸出的腐蝕圖像數據
- * width: 圖形尺寸寬度
- * height: 圖形尺寸高度
- * nWindows: 腐蝕操作結構元素尺寸,當nWindows=3時,如下:
- * 1 1 1
- * 1 1 1
- * 1 1 1
- * \返回值:
- * 無
- * \函數說明: 實現圖像形態學算子-膨脹
- *
- ************************************************************************/
- void CDilationDlg::DilationAlgorithm(CvMat *pGrayMat, CvMat *pErosionMat, int width, int height, int nWindows)
- {
- int nSize = (int)(nWindows/2);
- for(int i=0; i<height; i++)
- {
- for(int j=0; j<width; j++)
- {
- int nFlag = 1; //用於控制循環跳出
- for(int m=i-nSize; m<=i+nSize; m++)
- {
- for(int n=j-nSize; n<=j+nSize; n++)
- {
- if((m>=0)&&(m<height)&&(n>=0)&&(n<width))
- {
- double nData = cvmGet(pGrayMat, m, n);
- if((nData == 0)) //如果覆蓋區域有一個黑點,則設置保留當前結構元素中心點
- {
- nFlag=0;
- break;
- }
- }
- }
- if(nFlag==0)
- break;
- }
- if(nFlag==0)
- {
- double nData = 0;
- cvmSet(pErosionMat, i, j, nData);
- }
- else
- {
- double nData = 255;
- cvmSet(pErosionMat, i, j, nData);
- }
- }
- }
- }
對程序實現的主要說明如下:
1)選擇腐蝕結構元素:本文對結構元素的選取不做過多的討論,採用最簡單常見的正方形結構元素,其全部像素均爲1。這樣一個結構元素相對於其原點的映射還是自身,因此在代碼實現中沒有進行相關的反射操作。所實現的函數DilationAlgorithm中最後一個參數用於控制結構元素尺寸。
2)邊界處理:由於結構元素有一定的尺寸,因此當結構元素中心移動到圖像邊緣的若干個像素時,可能有一部分的結構元素超出了圖像邊界,這是本程序的處理方法是:將圖像進行虛擬擴充,擴充的元素灰度值全部填255(根據上文定義,即爲無意義的白色像素填充).
3)原始圖像選擇:所選擇圖片是白底上面有幾個離散的黑點。這樣可容易看出經過膨脹後黑點相對大小的變化。
4、膨脹結果分析
顧名思義,腐蝕操作可以使得圖像減小“一圈”,同時腐蝕操作能夠將圖像中較小的細節消除掉(效果與結構元素形狀和尺寸有關)。以下是程序運行的結果。(爲了能使得圖像看起來清晰一點,對每幅圖的前景和背景進行了反色處理)
圖3 膨脹結果反色(結構元素尺寸爲11)
對比圖2與圖1可以看出,經過尺寸爲3的結構元素膨脹後,4個孤立的點尺寸都變大了,這說明了膨脹操作能夠根據結構元素對圖像中的有效像素進行擴充;
另外,對比圖2與圖3可以看到,當結構元素尺寸增大到11時,圖中白色圓圈範圍內的兩個點集被膨脹爲一個點,這說明了膨脹操作可以將小的裂縫橋接起來,根據這個功能我們能夠對圖像斷裂進行恢復。
需要注意的是,當結構元素不是對稱的時候,必須要對元素先進行自身映射,不然得到的結果是不合理的。
歡迎登陸我的個人主頁,hello2019,查看原文:http://richardliu.cn/