未分類

【Q.11-20】画像処理100本ノックの解法を全部載っける

こんにちは、チズチズです。

先日の記事の続きです。

【Q.1-10】画像処理100本ノックの解法を全部載っける

Q.11-20

Q.11 平滑化フィルタ

前のメディアンフィルタが平均フィルタになっただけです。

前のコードのnp.median()をnp.mean()にするだけでOKです。

Q.12 モーションフィルタ

今度は対角方向をとります。ループはパディングされてる端から回しているので、+1と+2になり、[1, 1]が注目画素になります。

後は平均とるだけなのでさほど難しくはないでしょう。

Q.13 MAX-MINフィルタ

やることはさほど変わりません。ただ、グレースケールにしたので3次元配列から2次元配列になりました。

Q.14 微分フィルタ

こっちは縦方向の微分フィルタです。横方向の微分フィルタにするにはKの重みを変えればいいだけです。

どうやら、outをfloat型にしないと正常に画像処理が行われないようなのでそこは注意して下さい。

Q.15 Sobelフィルタ

前置きは関係ないです。Kだけ見れば実装できます。さっきのコードのKを変えればいいだけです。ちょっと怖くなったので全部float型にしました。(uint8じゃないといけないところ以外)

横方向のフィルタは先程と同様にKを変えるだけです。

Q.16 Prewittフィルタ

上のコードのKを変えるだけです。

Q.17 Laplacianフィルタ

これも上のコードのKを変えるだけです。読みたければ問題文の理論的な部分も読んでみると良いと思います。

Q.18 Embossフィルタ

こちらも同様上のコードのKを変えるだけです。エンボスってあのエンボスですよね。きっと画像編集ソフトでもこんな処理を行ってるはず(?)

Q.19 LoGフィルタ

ガウシアンフィルタに似ています。ただ、パディング範囲が1行1列広がりました。うまい具合に処理すると出来ます。

俺はLoG関数の最後の計算の書き忘れでバグらせてしまったので、問題はよく見ましょう……

解いてみた感じだとガウシアンフィルタを理解すればここまでの問題はスラスラ解けるのかなーといった次第です。

Q.20 ヒストグラム表示

そのままやると最大値と最小値がグラフの幅になってしまうので色々調整します。

結局answerコードと同じになりますが、これでいいと思います。

では、hist()の引数を軽く紹介しようと思います。

bins階級数
rangebinsの最小値と最大値
rwidth各々の棒の幅
color棒の色
label凡例を載せる

20問終わって

11問目からはそこまで難しくなかった印象です。(1-10の問題の応用といった感じ)

大まかな処理はわかっても、その中にある細かい部分を誤解しているとエラーを吐かれてしまいます。

自分が原因不明のバグに出会ったときは、

  1. エラーコードでググる
  2. 問題文を読み直す
  3. 解説コードを参考にコードを修正する

の順番でやっています。

できるだけ自分の力で……って思っていますが、問題は案外難しくてそう簡単にはいかないことが数多くありました。例えば、何も設定してない時はエラーだけどfloatにしたら正常に動作したとき。このときは本当に辛かったです。まさかこんな小さなところでプログラム全体に影響を与えていたとは思ってもいなかったからです。

画像処理100本ノックをやることで色々なことを学べたと思います。画像処理の技術はもちろん、コードのきれいな書き方やエラーの対処法など様々です。それほど学びが多い良問題だらけなので、ぜひ興味があればやってみて下さい。

お読み頂きありがとうございました。