• 締切済み

二次元画像に対する一重for文の処理

二次元画像に対する一重for文の処理 諸事情により二次元画像に対して一重のfor文でフィルタ処理を行いたいです for(i=radius;i<height-radius;i++){ for(j=radius;j<width-radius;j++){ .... } }     ↓ for(i=radius;i<width*height-radius;i++){ .... } このようにしたとき, 画面端からフィルタサイズの半径分だけ処理を行わないようにしたいのですが, うまい方法はないでしょうか? 自分で考えたのが, if((i%width>width-radius)&&(i%width<radius)) これをちょっと変えて if((i+radius)%width<2*radius) とし, 条件に当てはまるときに処理を行わないというものです。 ですが, 速度の面からできるだけ剰余を使いたくないので他の方法を考えています。 これぞという方法を知っている方, 是非教えてください。 よろしくお願いします。

みんなの回答

  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.5

どうしても1重ループでなければならず、剰余を使いたくないのなら、 x = width-radius*2; i = radius; for (count = (width-radius*2)*(height-radius*2); count > 0; --count) {   …   i++;   if (--x == 0) {    i+=radius*2;    x = width-radius*2;   } } こんなとこでしょうか。 やってることは2重ループみたいなもので、2重ループより効率悪いですけど。

すると、全ての回答が全文表示されます。
  • titokani
  • ベストアンサー率19% (341/1726)
回答No.4

速度の面で考えるなら、素直に2重ループにするほうが早いでしょう。 無理に一重ループにしても、無駄な部分のループができますから、その分遅くなります。 それでも、どうしても2重ループにはできないのであれば、剰余を使うよりないでしょうね。

abc4416
質問者

お礼

ありがとうございます やはり剰余を使うほかありませんかorz

すると、全ての回答が全文表示されます。
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.3

1重ループで複雑な条件を考えるよりは、 素直に2重ループの方がいいでしょう。 pos = radius; for(i=0;i<height-radius*2;i++){ for(j=0;j<width-radius*2;j++, pos++){ .... } pos+=radius*2; } といった形で pos を計算すれば、1重ループと同等のアクセスができます。

abc4416
質問者

お礼

ありがとうございます 二重ループのほうが良いのはわかるのですが, 課題のようなものでどうしても一重のfor文で実現したいのです

すると、全ての回答が全文表示されます。
  • BellBell
  • ベストアンサー率54% (327/598)
回答No.2

たとえば以下のような7×4の画像があったとして、処理するのは内部の5×2の領域だった場合 ■■■■■■■ ■□□□□□■ ■□□□□□■ ■■■■■■■ ループは5×2で回して、処理する際にオフセットを掛ければいいんじゃないかな。 冗長に書けば int hOffset = radius; int vOffset = radius; int innerWidth = width - radius * 2; int innerHeight = height - radius * 2; for(i=0;i<innerWidth*innerHeight;i++){ shori(i % innerWidth + hOffset,i / innerWidth + vOffset); } ピクセル単位で処理するという仮定等を勝手に入れてます。 端数は自動で切り捨ててくれるハズという期待で処理してたりもしますが。 (CPU依存?コンパイラ依存?それともCでは必ず切り捨てられる仕様かな?) 判り易い事を重視して冗長に(けっこう適当に)書いてるので、間違いがあっても読み替え可能でしょう。 速度面で剰余を使いたくないという割に、ifはもっと速度が遅くないかい(内容にもよるが)?等の疑問もありますが。

abc4416
質問者

お礼

ありがとうございます ソースコード, 図ともに参考になりました 確かにif文を使うよりこちらのほうが良さそうです if文は必ず使うだろうと勝手に決め付けてたのですが, そんなことないのですね

すると、全ての回答が全文表示されます。
回答No.1

とりあえず、以下のようにすれば多少は処理が軽減されるでしょう for (i = (width * radius) + radius; i < (width * (height - radius)) - radius; i++) { }

abc4416
質問者

お礼

ありがとうございます うかつでしたorz

すると、全ての回答が全文表示されます。

関連するQ&A