0

私は次のことができるループを作ろうとしています:-

x x x y y y y y
x x x y y y y y
x x x y y y y y
y y y y y y y y 
y y y y y y y y 

(ちなみに、上記は 8x5 グリッドです。)

  1. x としてマークされたすべての値を取得します
  2. 9 つの x 値をすべて合計する
  3. x の値を、先ほど見つけた合計の値に置き換えます
  4. 次に、すべての x 値に 1/9 を掛けます
  5. 次に、次のように x 値の次のブロックに移動します。
y y y x x x y y
y y y x x x y y
y y y x x x y y
y y y y y y y y 
y y y y y y y y 

私はこれをやってみました: -

for(int j=0;j<image.rows;j++)
{
    for (int i=0;i<image.cols;i++)
    {
        for (int y=0; y < 9; y++) {
            sum = image.at<uchar>(j,i) + sum;
            change = sum/9;
        }
        image.at<uchar>(j,i) = change;
    }
}

しかし、それはうまくいきません。

4

4 に答える 4

2

@zakinster さんはすでに良い解決策を提供してくれましたが、ループを使用する代わりに、OpenCV の関数を使用して、平均の計算や値の設定などの操作を実行することをお勧めします。これにより、はるかに短く読みやすいソリューションが作成されます。また、画像が 3 の倍数でない場合にアルゴリズムが機能することを確認する必要があります。この場合の通常の C++ のトリックは、x の代わりに (x/3*3) を使用することです。

コードは次のようになります。

for(int j=0; j<image.rows/3*3; j+=3)
    for(int i=0; i<image.cols/3*3; i+=3)
    {
        Mat tmp(image,Rect(i,j,3,3));
        tmp.setTo(mean(tmp));
    }

同じコードのさらに短いが読みにくいバージョン:

for(int j=0; j<image.rows/3*3; j+=3)
    for(int i=0; i<image.cols/3*3; i+=3)
        image(Rect(i,j,3,3)).setTo(mean(image(Rect(i,j,3,3))));
于 2013-11-06T09:30:57.597 に答える