2D Wavelet Transform(順変換、逆変換)のPython スクリプトを書いた。

2Dの写真などの画像について、Wavelet Transform (ウェーヴレット変換)という多重解像度解析を試したいなと思い、Pythonで書かれたスクリプトをインターネット検索で探したのですが、逆変換まで含めて簡単に実行出来るものは見つかりませんでした。

無い物は作るべしという事で、自作致しました。
ウェブ サーフィンをしながら幾人もの立派な方々によるウェーヴレット変換のコードのスニペットを拝見致しましたが、そのまま使えるものはなかったので、処理の仕方を参考にしながらコードを書き、ウェーヴレット変換のPython スクリプトを完成させる事が出来ました。

但し、簡単な反面、実用性に乏しい不連続な Haar 基底です。
拙いコードですが、GitHubにてソースコードを公開致しますので御自由にお使い下さいませ。

“GitHub” の “WaveletTransform” のリポジトリー:
https://github.com/ImpactCrater/WaveletTransform/

“Wikipedia” / “多重解像度解析”

青空を背景にした真紅の薔薇の花の写真。
入力した薔薇の花の写真。

これが入力画像です。
入力画像の縦横比と画素数は自由です。
プログラム側で適切にパディング致します。
順方向の変換、逆変換共に、入力画像はプログラム内でunsigned int16 /chに変換され、float32精度でウェーヴレット変換処理を施された後、unsigned int16 /chの画像として出力されます。

灰色の背景にタイル状に数段階の大きさで同じ薔薇の花の輪郭が浮かび上がった画像。
ウェーヴレット変換した画像。
見易いように局所的コントラスト調整などを施してある。

これが3段階順方向のウェーヴレット変換の出力画像(見易さの為、局所的コントラスト調整などを適用済み)です。
何段階でも設定出来ます。
画像の左上に行く程解像度が下がり、低周波数領域になります。
画像の4分割の内の左上が4画素の平均、右上が左右画素の差分、左下が上下画素の差分、右下が4画素の差分となっております。

青空を背景にした真紅の薔薇の花の写真。
ウェーヴレット逆変換した出力画像。

これがウェーヴレット逆変換を施した結果の出力画像です。
出力画像は入力画像と同じ結果となり、プログラムは正しく動作しているようです。

テスト スクリプト(main.py)では画像の読み書きにOpenCVを使用していますが、ウェーヴレット変換のスクリプト(waveletTransform.py)ではOpenCVは使わず、NumPy、ndarrayだけです。
入力画像の多次元配列の形状が同じならOpenCVは不要です。

順方向変換後に画像に何らかの方法で処理を施してから逆変換を施すと、中間の周波数成分を除去するなど出来ます。
或いは別の画像の変換画像と特定の周波数成分だけを合成したり出来ます。

最後に、参考にさせて頂いた幾つものウェブサイトの著者様方、コード スニペットの著者様方に感謝申し上げます。

コメント

タイトルとURLをコピーしました