3

私は現在、色付きの質量の最小慣性の軸を識別するためのアルゴリズムを実装しています(2次モーメントによって提供されます)。そのためには、最初の瞬間に与えられた重心を取得する必要があります。

加重平均関数はうまく機能しますが、外れ値のピクセルが原因で、望ましくない結果が得られます。

平均化関数は次のとおりです。

(例: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.

誤った重心

このような画像が2色(背景と前景)のみで表されている場合、範囲外のピクセルを削除するにはどうすればよいですか?注:範囲外のピクセルとは、大きなカラーマスの一部ではないものを指します。白い点は計算された重心ですが、これは正しくありません。

とても有難い。

4

3 に答える 3

1

開始点を指定して、接続されているすべてのピクセルを識別するフラッドフィルアルゴリズムがたくさんあります。

あるいは、ノイズに起因するこれらのような小さなアウトライアを削除する一般的な方法は、画像を侵食してから、画像を拡張して同じサイズに戻すことです。ただし、純粋にCoGを実行している場合は、必ずしも拡張ステップは必要ありません。

于 2012-07-13T14:14:20.070 に答える
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としてカウントされます。次に、合計に別の数値を使用します。

フィルタのサイズを大きくすることで精度を上げることができます-3x3ではなく5x5のように。その場合、2つ離れたピクセルはさらに少なくカウントされます。

于 2012-07-13T14:39:37.223 に答える
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.

これが以前の投稿「2Dマトリックス内の任意の角度で値の最長ストレッチを見つけるためのアルゴリズム」に関連していると仮定すると、同じループ内の他の1次モーメントと2次モーメントを計算する必要があります。

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

(アルゴリズムのtempSumXはm10で、totalForegroundはm00です)

これを試してみてください。それでも外れ値に問題​​がある場合は、Connected ComponentLabelinghttp ://en.wikipedia.org/wiki/Connected_component_labelingを使用して最大の質量を見つけることができます。bwlabel(またはを使用してmatlabで使用できbwconncompます。)

于 2012-07-13T21:31:53.363 に答える