1. 程式人生 > >【數字影象處理】影象的面積與周長計算

【數字影象處理】影象的面積與周長計算

 

二值化影象區域標記

在二值化影象中,相互聯結的黑畫素集合成為一個(黑)區域,通過對影象內每個區域進行標記操作,求得區域的數目。
處理前的f是二值的,畫素要麼為0(黑),要麼為255(白)
處理後每個畫素的值即為其所處理區域的標號(1,2,3,。。。)

標記規則
1.初始化標記為0,從左到右,從上到下逐個畫素掃描
2.若該點為物體顏色,則繼續判斷該點的左上、正上,右上及左前點是否都不為物體,則標號加1,若該點為背景色,則跳過。
3.優先順序依次為右上點,正上點,左上點及左前點。右上點的優先順序最高,左前點的優先順序最低。
4.繼續遍歷影象,若右上點為物體,則該點標記上與右上點相同的值。
5.若右上不為物體,則判斷正上點,左上點及左前點

特殊情況:當前點的右上點及左前點為不同標記,正上點和左上點不為物體,則當前點標記同右上點置相同的值,把所有標記與左前點相同的畫素值都標記成與右上點同樣的值。

如圖下面的黑點,如果出現上面的特殊情況,可以這樣處理:

 

 

 

int sign_count = 0;
int sum[5] = {0};
int sign_temp;
for(int y = 1; y<120 - 1;y++)
    for(int x = 1; x<180 - 1;x++)
    {   
        //只有當畫素點為物體,才進行下面的判斷。
        if(img[y][x] == 0)
        {
         //解決特殊情況
          if(img[y-1][x+1] != img [y][x-1] && img[y-1][x-1] == img[y-1][x])
            {
            img[y][x] = img[y - 1][x + 1];
            sign_temp = img [y][x-1];
            for(int i = 0; i<y; i ++)
                for(int j = 0; j<x;j++)
                {
                    if(img[i][j] == sign_temp)
                    img[i][j] = img[y][x]
                }
            
            }
            
           //如果該點周圍四個點皆為背景,則說明該點新的物體,將標記累加,並將該點賦值為標記。
           if((img[y][x - 1] + img[y - 1][x - 1] +img[y - 1][x] +img[y - 1][x + 1])/4 !=0)
            {
                   sign_count+=1;
                img[y][x] =sign_count;
            }
              //如果該點周圍有存在物體,則按優先順序,將標號賦值給該點。
           else{
            if(img[y - 1][x + 1]!= 0)
                img[y][x] = img[y - 1][x + 1];

            else if(img[y - 1][x] != 0)
                img[y][x] = img[y - 1][x];

            else if(img[y - 1][x - 1] != 0)
                img[y][x] = img[y - 1][x - 1];

            else
                img[y][x] = img[y][x - 1];
            }

        }
    }    
//影象面積統計
for(int y = 1; y<120 - 1;y++)
    for(int x = 1; x<180 - 1;x++)
    {      
        switch(img[y][x])
        {
        case 0:{sum[0]++;break;}
        case 1:{sum[1]++;break;}
        case 2:{sum[2]++;break;}
        case 3:{sum[3]++;break;}
        case 4:{sum[4]++;break;}
        }
    }
}

 

  • 二值化影象區域的面積測量

在二值化影象中,通過對影象內的每個畫素進行標記操作,將物體的畫素值改為標號,求各種標號的總和,即求得不同區域的面積數目。

 

  • 二值化影象的周長測量

在二值化區域標記的基礎上,物體的畫素值改為標號,再採用邊界跟蹤法,跟蹤各封閉區域邊界線(輪廓線)的每個黑畫素的標號,記錄二值影象物體邊界。

 

  • 二值化化影象的小區域消除

再二值化影象的區域標記基礎上,通過對影象內每個標記區域進行計算,求得總區域得數目,並求得每個區域面積(畫素數)在閾值以下時,則消去該區域,全部置為255(白),由此得到新圖形。

&n