【數字圖像處理】二值化圖像腐蝕運算與膨脹運算


 

形態學基本概念

基本思想:用一定形態的結構元素去度量和提取圖像中的對應形狀,達到分析知識的目的。可用於圖像處理的各個方面,包括圖像分割、邊界檢測、特征提取。

結構元素:形態學變換中的基本元素,使為了探測圖像的某種結構信息而設計的特定形狀和尺寸的圖像,稱為收集圖像結構信息的探針。
結構元素有多種類型:如圓形、方形、線型等,可攜帶知識(形態、大小、灰度和色度信息)來探測、研究圖像的結構特點。

形態學運算包括:二值化腐蝕和膨脹、二值化開閉運算、骨架抽取、擊中擊不中變換等。
形態學四個基本算子:膨脹,腐蝕、開啟和閉合組成,這些基本運算還可以推導和組合成各種數學形態學實用算法。

 

腐蝕運算

腐蝕運算思路:定義結構元素(與模板類似),結構元素在整幅圖像中移動,移動到每個像素點上,只有結構元素與圖像上對應像素點的像素值全部相等時,保留這個像素點的值。
腐蝕運算作用:消除物體邊界點,使邊界點向內部收縮,可以把小於結構元素的物體去除。選取不同大小的結構元素,去除不同大小的物體。如兩個物體間有細小的連通,通過腐蝕可以將兩個物體分開。

腐蝕運算

 

 

 

 腐蝕運算示意圖

基本方法:

通常拖到結構元素在X域移動,在每一個位置上,當結構元素B在中心平移到X圖像上的某優點(x,y)。

如果結構元素內的每一個像素都與以(x,y)為中心的相同鄰域中對應像素完全相同,那么就保留(x,y)像素點。

對於不滿足條件的像素點則全部刪除,達到邊界向內收縮效果。

 

 

 

腐蝕運算c語言實現

  • 水平腐蝕:不處理左右兩邊
  • 垂直腐蝕:不處理上下兩行
  • 全方位腐蝕:不處理四周
            int Image[120][180];                   
                    memset(Image, 0, sizeof(Image));
                   
                //全方位腐蝕運算
                            for (int i = 1; i < Use_ROWS-1; i++)
                            {
                                for (int j = 1; j < Use_Line - 1; j++)
                                {
                                    if (Image_Use[i][j] == 255 &&
                                        Image_Use[i][j + 1] == 255 &&
                                        Image_Use[i][j - 1] == 255)
                                    {
                                        Image[i][j] = 255;
                                    }

                                }
                            }

 

 

膨脹運算

膨脹運算思路:定義結構元素(與模板類似),結構元素在整幅圖像中移動,移動到每個像素點上,如果結構元素與圖像上對應像素點的像素值至少有一個像素相等時,保留這個像素點的值。
膨脹運算作用:與腐蝕相反,對二值化物體邊界點擴充,將與物體接觸的所以背景點合並到該物體中,使邊界向外擴張。如果兩個物體之間的距離比較近,會把兩個物體連通到一起,對填補圖像分割后物體的空洞有用。

膨脹與腐蝕比較:

  • 膨脹:填充圖像中的小孔(比結構元素小的孔洞)及圖像邊緣處的小凹陷部分。
  • 腐蝕:消除圖像邊緣小的成分,並將圖像縮小,從而使其補集擴大。
  • 膨脹和腐蝕:並不互為逆運算,可以級聯結合使用。

膨脹運算

 

 

 

膨脹運算示意圖

 

 

膨脹運算c語言實現

  • 水平膨脹:不處理左右兩邊
  • 垂直膨脹:不處理上下兩行
  • 全方位膨脹:不處理四周
             int Image[120][180];                   
                    memset(Image, 0, sizeof(Image));
                   
                //全方位膨脹運算
                            for (int i = 1; i < Use_ROWS-1; i++)
                            {
                                for (int j = 1; j < Use_Line - 1; j++)
                                {
                                    if (Image_Use[i][j] == 255 ||
                                        Image_Use[i][j + 1] == 255 ||
                                        Image_Use[i][j - 1] == 255)
                                    {
                                        Image[i][j] = 255;
                                    }

                                }
                            }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM