未分類

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

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

【Q.1-10】画像処理100本ノックの解法を全部載っける前の記事の続きです。

Q.21-30

Q.21 ヒストグラム正規化

説明に書いてあることを書くだけです。

念のためにaやbは浮動小数点型にしています。

Q.22 ヒストグラム操作

こちらも同様です。

標準偏差と平均をとって説明に書いてあることを読んで実装すれば動きます。

Q.23 ヒストグラム平坦化

こっちは少し手間がかかりました。解説コードにはrange(1, 255)になっていましたが、僕はrange(256)にしました。一応解説に合わせておきます。

resにデータを蓄積させています。そこまで難しい問題ではなさそうです。

Q.24 ガンマ補正

拡大後のサイズでループを回すことに注意すれば大丈夫だと思います。

Q.25 Bi-linear補間

このコードは解説コードと被りになります。(実装できなかった)

numpyを使ってやったほうが計算が高速化されたり、コードが短くなりますが、NumPyゴリ押しのコードの発想が浮かび上がらないのでw普段はforでやってますが、わからなかったのでコメントだけになります。

コメントを見ていただければ何が行われているか分かると思います。

Q.27 Bi-Cubic補間

dx1~dy4までの代入でコードが長くなってしまいました。重みを一括でリストに入れることで、その後のコーディングが楽になったと思います。

分子と分母は別に計算しないとバグらせて詰みます。(それでバグらせた

Q.28 アフィン変換(平行移動)

ここからは少し難しくなります。Kの中に重みを入れれば動きます。逆行列を求めている理由は、この記事の最後に掲載するので良かったら見てみて下さい。

最後の方にあるはみ出たら~の部分は変換前の座標をはみ出てしまった場合(表示しない範囲)は処理をしないというコードになります。

Q.29 アフィン変換(拡大縮小)

 

上がカッコ1で下がカッコ2の方です。先程のコードの重みを変えただけです。

この重みについても最後触れておこうと思います。

Q.30 アフィン変換(回転)

 

上のコードは自分で書いたものですが、下のコードは解説コードです(その代りといったら難だがデバッグを何回もして動作を確認した)

上のコードは回転させるためにsin30度とcos30度の正負を入力しました。

下のコードはコメントちゃんと書いたのできっとわかると思います。(わからなかったらコメントでも質問してみて下さい)

余力があれば自分でもう一度挑戦してみたいと思っています……

アフィン変換について

アフィン変換の意味と4つの基本要素

この人の記事を参考にしました。

このように一気に平行移動や拡大縮小、回転を表すことが出来ます。(平行移動と回転は同時に出来ないけれど)

加えて、赤きちさんがとてもわかりやすい図を作ってくれたので掲載しようと思います。

これは逆行列を使う理由にも直結しています。

例えば2倍に変換するアフィン変換のコードを組んだとして、変換前の座標に合わせていたら1マス空いてしまいます。そのため、変換後の座標に合わせてコードを組むことで正常に画像処理を行うことが出来ます。

最後のコードですが、sinの正負が反対になっていました。なぜかというとyの位置が想定と違うからです。

座標平面で表すとしたら、取り扱う画像は第四象限に当たります(yは絶対値になるけれど)が、想定は第一象限です。そのため、元のままだと時計回りに30度回転してしまいます。

まとめ

ここまで来るのに予想以上に時間がかかってしまいました。アフィン変換の技術は素晴らしいですが、その技術を扱うためには相当な時間と根気が必要でした。

特にアフィン変換の逆行列にするところはバグりまくりで大変でしたが、他人の力も借りて何とか実装出来ました。

僕の記事で少しでも参考になれば幸いと思っています。

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

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です