二值圖像的膨脹運算及其VC實現

本文主要對二值圖像膨脹的定義、原理以及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實現灰度圖的二值膨脹

      首先貼上代碼,然後再進行說明。作者實現的代碼如下:

  1. /************************************************************************* 
  2. * 
  3. * \函數名稱: 
  4. *   DilationAlgorithm() 
  5. * 
  6. * \輸入參數: 
  7. *   pGrayMat:      二值圖像數據 
  8. *   pErosionMat:   輸出的腐蝕圖像數據 
  9. *   width:         圖形尺寸寬度 
  10. *   height:        圖形尺寸高度 
  11. *   nWindows:      腐蝕操作結構元素尺寸,當nWindows=3時,如下: 
  12. *                                  1    1    1 
  13. *                                  1    1    1 
  14. *                                  1    1    1 
  15. * \返回值: 
  16. *   無 
  17. * \函數說明:  實現圖像形態學算子-膨脹 
  18. * 
  19. ************************************************************************/  
  20. void CDilationDlg::DilationAlgorithm(CvMat *pGrayMat, CvMat *pErosionMat, int width, int height, int nWindows)  
  21. {  
  22.     int nSize = (int)(nWindows/2);  
  23.     for(int i=0; i<height; i++)  
  24.     {  
  25.         for(int j=0; j<width; j++)  
  26.         {  
  27.             int nFlag = 1;     //用於控制循環跳出  
  28.             for(int m=i-nSize; m<=i+nSize; m++)  
  29.             {  
  30.                 for(int n=j-nSize; n<=j+nSize; n++)  
  31.                 {  
  32.                     if((m>=0)&&(m<height)&&(n>=0)&&(n<width))  
  33.                     {  
  34.                         double nData = cvmGet(pGrayMat, m, n);  
  35.                         if((nData == 0))  //如果覆蓋區域有一個黑點,則設置保留當前結構元素中心點  
  36.                         {  
  37.                             nFlag=0;  
  38.                             break;  
  39.                         }     
  40.                     }         
  41.                 }  
  42.                 if(nFlag==0)  
  43.                     break;  
  44.             }  
  45.             if(nFlag==0)  
  46.             {  
  47.                 double nData = 0;  
  48.                 cvmSet(pErosionMat, i, j, nData);  
  49.             }  
  50.             else  
  51.             {  
  52.                 double nData = 255;  
  53.                 cvmSet(pErosionMat, i, j, nData);  
  54.             }  
  55.         }  
  56.     }  
  57. }  

      對程序實現的主要說明如下:

      1)選擇腐蝕結構元素:本文對結構元素的選取不做過多的討論,採用最簡單常見的正方形結構元素,其全部像素均爲1。這樣一個結構元素相對於其原點的映射還是自身,因此在代碼實現中沒有進行相關的反射操作。所實現的函數DilationAlgorithm中最後一個參數用於控制結構元素尺寸。

      2)邊界處理:由於結構元素有一定的尺寸,因此當結構元素中心移動到圖像邊緣的若干個像素時,可能有一部分的結構元素超出了圖像邊界,這是本程序的處理方法是:將圖像進行虛擬擴充,擴充的元素灰度值全部填255(根據上文定義,即爲無意義的白色像素填充).

      3)原始圖像選擇:所選擇圖片是白底上面有幾個離散的黑點。這樣可容易看出經過膨脹後黑點相對大小的變化。

4、膨脹結果分析

       顧名思義,腐蝕操作可以使得圖像減小“一圈”,同時腐蝕操作能夠將圖像中較小的細節消除掉(效果與結構元素形狀和尺寸有關)。以下是程序運行的結果。(爲了能使得圖像看起來清晰一點,對每幅圖的前景和背景進行了反色處理)

圖1 待處理圖像反色結果
圖2 膨脹結果反色(結構元素尺寸爲3)


圖3 膨脹結果反色(結構元素尺寸爲11)

       對比圖2與圖1可以看出,經過尺寸爲3的結構元素膨脹後,4個孤立的點尺寸都變大了,這說明了膨脹操作能夠根據結構元素對圖像中的有效像素進行擴充;

      另外,對比圖2與圖3可以看到,當結構元素尺寸增大到11時,圖中白色圓圈範圍內的兩個點集被膨脹爲一個點,這說明了膨脹操作可以將小的裂縫橋接起來,根據這個功能我們能夠對圖像斷裂進行恢復。

      需要注意的是,當結構元素不是對稱的時候,必須要對元素先進行自身映射,不然得到的結果是不合理的。


歡迎登陸我的個人主頁,hello2019,查看原文:http://richardliu.cn/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章