プロが教える店舗&オフィスのセキュリティ対策術

VisualStudio2013でC++のプログラミングをしています。モノクロ画像でモザイク処理のプログラミングをしていますが、なかなかうまくいかないので質問させていただきました。指摘が欲しいプログラミングは以下の通りです。

int a,i,j; /*3~4つ目のfor文に使います。aは特定箇所の平均輝度値として使用します*/
int siz=8; /*モザイクのブロック処理の大きさです。8*8でモザイク処理をします*/

for (y = 0; y<256; y++){/*256は画像Y軸です*/
for (x = 0; x<256; x++){/*256は画像X軸です。この2つのforで画像全領域を参照します*/
for (y=0;y<i*siz; y++){/*Y軸で指定した箇所のみ参照のつもりですが、色々間違っているようです*/
for (x = 0; x <j*siz; x++){/*X軸で指定した箇所のみ参照のつもりですが、色々間違っているようです*/
a = a + in_image[y][x]; /*in_image[y][x]はYとXの座標に該当したピクセルの輝度値です*/
}
}
a = a / (siz*siz); /*特定箇所を収集された輝度値の平均を出しています*/
for (y = 1*i; y < i*siz;y++){/*特定箇所のみを指定します*/
for (x = 0; x < j*siz; x++){/*特定箇所のみを指定します*/
out_image[y][x] = a; /*out_image[y][x]は出力する箇所の輝度値です。特定箇所にaで代入します*/
}
}
i++;
j++;/*画像全てを8*8モザイク処理するまでは繰り返します*/
}
}

詳しい条件は以下の通りです
・画像の読み込みや出力などは省略しています。
・3、4つめのfor文ではモザイク化する箇所を参照し、8*8の平均輝度値を求めたいです。
・5、6つめのfor文では求めた輝度値で参照した8*8の箇所に輝度値を代入したいです。
・この6つのforループで256*256の画像を8*8モザイク化したいです。
・指摘、変更して欲しい箇所は3つめのfor文以降です。intを更に宣言はOKで、for文などの個数を増やしたり減らすのはNGでお願いします。

A 回答 (2件)

一番外側のループで回答しましたが、実際はiの値次第で外側のxのループがずっと続くか、外側のループが1回だけになるか…。


いずれにしろ期待動作はしません。

何よりiの値も不定ですし。


>・3、4つめのfor文ではモザイク化する箇所を参照し、8*8の平均輝度値を求めたいです。

外側の2つのループはステップを8に(サイズが256なら32回回ればいい)、
内側の2つのループで8x8の領域の精査を行うようにすればいいでしょう。
当たり前ですがカウントに使う変数は別にして。
    • good
    • 0

細かく見てはいませんが…



>for (y = 0; y<256; y++){
のforループの内側に
>for (y=0;y<i*siz; y++){
のforループが存在します。
どっちも『同じ変数y』を使用します。

外側のループ開始でyが0になりました。
次のループではy++により、1になっていることを期待します。

さて、内側のループ開始でyを0にしました。
ループ終了したときには『内側のfor文で指定しているy++により』インクリメントされてi*sizになって無事ループ終了しました。
めでたい!!

では外側のループ続けるためにy++を実行しましょう。
外側のループは前回yが0で今度は1になっていないといけません。
さて、値はいくつでしょう?
先ほどおめでたい行事があったことは忘れてはいけませんね。



ループ実行中にカウントに使っている変数がどうなるのか意識しないと。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


このQ&Aを見た人がよく見るQ&A