2014-03-24 20 views
2

我感興趣的是找到整個二進制圖像的座標(X,Y),而不是每個組件的CoM。 我怎樣纔能有效地做到這一點? 我想使用regionprops,但找不到正確的方法來做到這一點。如何找到我的整個二進制圖像的質量中心?

+0

你有[centroid]的等式(http://en.wikipedia.org/wiki/Image_moments#Examples),對不對?你嘗試過編碼嗎? – beaker

+0

計算邊界框然後計算質心? (因爲你不想要單個組件的質心)。 –

+0

我有方程,並且計算邊界框不會考慮不同部件之間的孔和間隙。 – idow09

回答

8

可以定義所有區域作爲一個單一的區域供regionprops

props = regionprops(double(BW), 'Centroid'); 

BWregionprops數據類型決定其是否應標記每個連接部件作爲不同的區域或治療所有非零作爲單個區域有幾個組件。


或者,您也可以自己計算的重心

[y x] = find(BW); 
cent = [mean(x) mean(y)]; 
6

只是遍歷所有像素計算它們的X和Y的平均座標

void centerOfMass (int[][] image, int imageWidth, int imageHeight) 
{ 
    int SumX = 0; 
    int SumY = 0; 
    int num = 0; 
    for (int i=0; i<imageWidth; i++) 
    { 
     for (int j=0; j<imageHeight; j++) 
     { 
      if (image[i][j] == WHITE) 
      { 
       SumX = SumX + i; 
       SumY = SumY + j; 
       num = num+1; 
      } 
     } 
    } 

    SumX = SumX/num; 
    SumY = SumY/num; 
    // The coordinate (SumX,SumY) is the center of the image mass 
} 

擴展這一方法爲灰色範圍爲[0..255]的縮放圖像:代替

if (image[i][j] == WHITE) 
       { 
        SumX = SumX + i; 
        SumY = SumY + j; 
        num = num+1; 
       } 

使用以下計算

SumX = SumX + i*image[i][j]; 
SumY = SumY + j*image[i][j]; 
num = num+image[i][j]; 

在這種情況下的值100的像素具有比具有值1暗像素,高100倍重量,以便暗像素貢獻相當小部分質量計算的中心。 請注意,在這種情況下,如果圖像很大,您可能會遇到32位整數溢出,因此在這種情況下,請使用long int sumX,sumY變量而不是int

+3

我知道。但是C/C++等於java,可以讀爲純英文。所以其他那些絆倒這個問題並使用不同編程語言的人仍然能夠理解數學解決方案。我相信'idow90'將能夠理解算法並將其轉換爲Matlab,這基本上是您的答案 – DanielHsH

+0

即使顏色爲黑色,也不應該增加num嗎? 應用公式爲灰度圖像,我應該添加所有非黑色的顏色? – user3452075

+0

num計算整個白色像素的數量。 SumX和SumY計算X和Y方向的積分。除以白色像素總數得出正確的答案。我爲您的要求擴展了灰度圖像的答案 – DanielHsH

相關問題