35*35のガウシアンフィルタ処理を行うプログラムを作成したいのですが、画像の端も処理しなくてはならなく、画像を上下左右に折り返しをして対応する画素を利用することと言われたのですが、画像の折り返し方が分からないので教えてください。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答1件
0
ベストアンサー
訂正:Bongoさんのコメントで気づきましたが説明の仕方が大変おかしかったです。質問者さんを混乱させたかもしれません。大変失礼しました。
35x35はガウシアンフィルターの「範囲」であって、画像のサイズとは関係ないですね。
元画像の座標が(x, y)のとき、その周辺の(35x35)の座標をどうとるべきかを考えるべきなので回答すべきは(x,y)を基準にして例えばx座標であればx-17~x+17の範囲のピクセル座標をどう計算するかという回答であるべきでした。
また最後に「折り返し」より「敷き詰めた方がよいと思う」と書きましたがガウシアンフィルターを元画像の近傍の点による演算をする前提で考えカーネルサイズが元画像より非常に小さいということと、元画像の上端と下端、右端と左端では画像が連続しているわけではないので、逆に「左右対称」「上下対象」として折り返す考え方の方が自然だと思いました。
この点、勘違いにより正反対のことをいってしまいました。
同じ画像を敷き詰める前提じゃない方がよさそうなので、剰余を用いた計算ではない考え方にしたほうがよさそうです。(x,y)の左に17ピクセル離れた点を求めるなら(x-17,y)としてx-17が0未満だったら絶対値を取り、右に17ピクセル離れた点を求めるなら(x+17,y)としてx+17が画像の幅W以上になっていたら(2W-(x+18),y)と考えるといった感じでしょうか。2W-(x+18)はW-1-(x+17-W)の変形です。画像の右端からはみ出た分だけ折り返すという意味合いです。
以下は元の回答
多分こういう考え方だと思います。
35x35の同じ画像が無限に敷き詰められていると考えるのです。
X座標 0... ...34 0... ...34 0... ...34 +----------------++----------------++----------------+ Y座標 |... ||... ||... | 0 |... ||... ||... | ... |... ||... U ||... | 34 +----------------++----------------++----------------+ +----------------++----------------++----------------+ |... ||... Q(x, 0) ||... | 0 | L||P(0, y) ||... | ... |... ||... ||... | 34 +----------------++----------------++----------------+
画像の座標を(x,y)と考えることにしましょう。
(x, y)の左の座標は簡単に考えると(x - 1, y)になりますが、このままだと点Pのように座標が
(0, y)の場合に座標が範囲外になってしまいます。この場合に左にはみ出るということは左隣に配置されたまったく同じ画像の右端のピクセルを参照すると考えるわけです。つまりLとなるので、(34, y)という座標として考えます。
これをうまく計算するには剰余を使います。左隣の点の座標は
((x + 34) % 35, y)
と考えるとどんなケースでもx座標は0~34の範囲内になります。
同様にQにある点の上隣の点はUであると考えて、(x, y)の上隣の点の座標を
(x, (y + 34) % 35)
とします。右隣、下隣の点も同様に考えればよいです。
ヒント:
(x - 1) % 35
とせずに(x + 34) % 35
と書く理由については「C言語で負の数の剰余を取るとどうなるか」を調べてみると答えがわかると思いますが、よく使う一つのトリックと考えてください。
注意:
上下左右に折り返しをして
自分の回答は「同じ画像を敷き詰める」という考え方になっていますが、「上下左右に折り返す」という指示は別の解釈もできます。折り返すのだから元の画像の左には元画像の左右対称の画像をくっつけるという考え方です。そういうふうにするなら座標の計算もそれなりにしなければならないですが・・・
ガウシアンフィルターの意味を考えれば上下左右に対象図形をくっつけるよりは同じ画像を敷き詰めるという考え方の方が適切なフィルターになるような気がします。
投稿2017/05/16 06:26
編集2017/05/16 07:13総合スコア18404
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/16 06:42 編集

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。