我有兴趣为我的整个二进制图像找到坐标(X,Y),而不是单独为每个组件找到 CoM。我怎样才能有效地做到这一点?我猜想使用 regionprops,但找不到正确的方法。
问问题
12663 次
2 回答
9
您可以将所有区域定义为单个区域regionprops
props = regionprops( double( BW ), 'Centroid' );
根据数据类型BW
regionprops
决定是否应该将每个连接的组件标记为不同的区域,或者将所有非零值视为具有多个组件的单个区域。
或者,您可以自己计算质心
[y x] = find( BW );
cent = [mean(x) mean(y)];
于 2014-03-24T17:39:00.960 回答
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
.
于 2014-03-24T20:44:36.620 回答