今回は前回に引き続きPythonのPywaveletsモジュールを用いたウェーブレット変換で2Dウェーブレット変換について紹介する。
1. 2Dウェーブレット変換
前回はPywaveletsモジュール PyWavelets - Wavelet Transforms in Python — PyWavelets Documentation を用いたウェーブレット変換を行った。今回はチュートリアルにあるように画像の2Dウェーブレット変換について紹介する。
画像を2Dウェーブレット変換すると、基本的には低周波成分と高周波成分に分解することができ、
高周波成分はエッジ抽出(他に画像勾配法やCanny法などがあるが)などに利用することができる。
import numpy as np from scipy import signal import matplotlib.pyplot as plt %matplotlib inline import pywt
今回は標準画像データベースのうち、Boatを使用する。Google Colabの場合は以下のようにファイルを読み込み、モノクロ画像gray
として処理を行う。
from google.colab import files uploaded_file = files.upload() uploaded_file_name = next(iter(uploaded_file)) orig = cv2.imread(uploaded_file_name) gray = cv2.cvtColor(orig, cv2.COLOR_BGR2GRAY) plt.imshow(gray,cmap='gray',vmax=255,vmin=0) plt.title('Original')
2. PyWaveletsによる2Dウェーブレット変換
2D離散ウェーブレット処理を行うにはdwt2
関数を利用する。処理を行う画像gray
と基底関数で今回はbior1.3
を指定してdwt2(gray,'bior1.3')
とすることで画像データを離散ウェーブレット変換することができる。出力はapproximation (LL),とdetailでdetailは3成分(LH,HL,HH)をタプルでまとめる。以下PyWaveletsのチュートリアルの通りに処理する。
titles = ['Approximation', ' Horizontal detail', 'Vertical detail', 'Diagonal detail'] coeffs2 = pywt.dwt2(gray, 'bior1.3') LL, (LH, HL, HH) = coeffs2 fig = plt.figure(figsize=(12, 3)) for i, a in enumerate([LL, LH, HL, HH]): ax = fig.add_subplot(1, 4, i + 1) ax.imshow(a, interpolation="nearest", cmap='gray') ax.set_title(titles[i], fontsize=10) ax.set_xticks([]) ax.set_yticks([]) fig.tight_layout()
出力結果は以下のようになり、Approximation (LL) は元画像の画素を落としたような画像、detailsのLH,HL,HHは横方向、縦方向、斜め方向のエッジが抽出されているような画像が得られる。
3. 様々な基底関数による変換
基底関数をbior1.3
以外に変更する場合は、例えばpywt.dwt2(gray, 'bior6.8')
とする。これ以外はすべて同じコードで処理すると
bior1.3
と比較して、より高周波のエッジが抽出されているように見える。実際に Wavelet Properties Browser のWavelet familiesで基底関数の形状を確認することができ、Biorthogonal 1.3 (Bior1.3)よりもBior6.8の方が関数形状が細かい。
他の基底関数でもいくつか試しに2Dウェーブレット変換した結果を示す。
ウェーブレットではよく使われるHarr関数では
離散的な形状のReverse Biorthogonal(rbio)関数では
1次元の信号の例でよく取り上げられているdb2では
4. まとめ
今回は2Dウェーブレット変換の方法と画像にいくつかの基底関数を用いて適用した例について紹介した。