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

  • 2019 年 10 月 22 日
  • 筆記

 

二值化影像區域標記

在二值化影像中,相互聯結的黑像素集合成為一個(黑)區域,通過對影像內每個區域進行標記操作,求得區域的數目。
處理前的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(白),由此得到新圖形。