【數字影象處理】影象的面積與周長計算
阿新 • • 發佈: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(白),由此得到新圖形。
&n