3

我目前正在实施一种算法,用于识别有色质量的最小惯性轴(由二阶矩提供)。为了做到这一点,我需要获得第一时刻给出的质心。

加权平均功能效果很好,但由于异常像素,我收到了不想要的结果。

这里是平均函数:

(例如 x 的加权平均值)

for (i = 0, i < rows, i++) {
    for (j = 0, j < cols, j++) {
        if (colorAt(i,j).isForeground()) {
            tempSumX++;
            totalForeground++;
        }
    }
    x_ += i*tempSumX;
    tempSumX = 0;
}
x_ /= totalForeground; //where x_ represents the x coordinate of the weighted center of mass.

质心不正确

给定这样的图像,它仅由两种颜色(背景和前景)表示,我如何去除边缘像素?注意:外围像素是指不属于大色块的任何东西。白点是计算的质心,这是不正确的。

非常感激。

4

3 回答 3

1

有很多洪水填充算法可以识别给定起点的所有连接像素。

或者,去除像这些来自噪声的小异常值的常用方法是腐蚀图像,然后将其膨胀以恢复到相同的大小 - 尽管如果你纯粹是在做 CoG,你不一定需要扩张步骤

于 2012-07-13T14:14:20.070 回答
0

我相信你的算法是不正确的。二进制图像中的 m10 (对不起,我不知道如何做下标)是前景像素的 x 坐标的总和,所以你的代码应该是这样的:

for (i = 0, i < rows, i++) {
    for (j = 0, j < cols, j++) {
        if (colorAt(i,j).isForeground()) {
            tempSumX += i;
            totalForeground++;
        }
    }
}
x_ = tempSumX/totalForeground; //where x_ represents the x coordinate of the weighted center of mass.

假设这与您之前的文章Algorithm for Finding Longest Stretch of a Value at any Angle in a 2D Matrix相关,您应该在同一循环中计算其他一阶和二阶矩:

m01 += j;
m20 += i*i;
m02 += j*j;
m11 += i*j;

(您的算法中的 tempSumX 只是 m10,totalForeground 是 m00)

试一试,如果您仍然遇到异常值问题,您可以使用 Connected Component Labeling http://en.wikipedia.org/wiki/Connected_component_labeling来找到最大的质量。bwlabel(在 matlab 中使用或可用bwconncomp。)

于 2012-07-13T21:31:53.363 回答
0

怎么样,在伪代码中:

for( y = 0; y < rows; y++ )
{    
   for ( x = 0; x < cols; x++ )
   {
       if ( pixel( x, y ).isColor() )
       {
          int sum = 0;
          // forgetting about edge cases for clarity...
          if ( !pixel( x-1, y-1 ).isColor() ) sum++;
          if ( !pixel( x,   y-1 ).isColor() ) sum++;
          if ( !pixel( x+1, y-1 ).isColor() ) sum++;
          if ( !pixel( x-1, y   ).isColor() ) sum++;
          if ( !pixel( x+1, y   ).isColor() ) sum++;
          if ( !pixel( x-1, y+1 ).isColor() ) sum++;
          if ( !pixel( x,   y+1 ).isColor() ) sum++;
          if ( !pixel( x+1, y+1 ).isColor() ) sum++;
          if ( sum >= 7 )
          {
             pixel( x, y ).setBackground();
             x -= 1;
             y -= 1;
          }
       }
   }
}

即移除由 7 个背景像素包围的任何像素。如果您将像素的颜色更改回可能受影响的最早像素。

您对“异常值”的度量可能会发生变化 - 例如,您可以将对角线像素视为价值 1/2 的值。例如,直接在上方、下方、左侧和右侧的像素计为 2。然后使用不同的数字作为总和。

您可以通过增加过滤器的大小来提高准确性——比如增加到 5x5 而不是 3x3。在这种情况下,像素 2 应该算得更少。

于 2012-07-13T14:39:37.223 回答