質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

2302閲覧

画像の折り返し

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2017/05/16 05:54

35*35のガウシアンフィルタ処理を行うプログラムを作成したいのですが、画像の端も処理しなくてはならなく、画像を上下左右に折り返しをして対応する画素を利用することと言われたのですが、画像の折り返し方が分からないので教えてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Bongo

2017/05/16 06:17

現状、どこまで出来上がっていますでしょうか。フィルタ処理を行っている部分のソースコードをご提示いただけると、アドバイスがより容易になるかと思います。
guest

回答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
KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Bongo

2017/05/16 06:42 編集

もしかすると、処理したい画像のサイズ自体はもっと大きく、「35*35」というのはガウシアンフィルターのカーネルサイズ(半径17.5ピクセルでぼかしたい)ということかもしれません。 いずれにせよ、画像の範囲外をどう扱うかということについてはKSwordOfHasteさんのヒントが大いにご参考になるかと思います。
KSwordOfHaste

2017/05/16 06:46

あ、おっしゃるとおりですね! この回答はかなりオッチョコチョイなことをいっちゃいましたw;
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問