つれづれなる備忘録

日々の発見をあるがままに綴る

Pythonによるデータ処理11 ~ ウェーブレット変換3

 今回は前回に引き続きPythonのPywaveletsモジュールを用いたウェーブレット変換で2Dウェーブレット変換について紹介する。

1. 2Dウェーブレット変換

前回はPywaveletsモジュール PyWavelets - Wavelet Transforms in Python — PyWavelets Documentation を用いたウェーブレット変換を行った。今回はチュートリアルにあるように画像の2Dウェーブレット変換について紹介する。

画像を2Dウェーブレット変換すると、基本的には低周波成分と高周波成分に分解することができ、

画像のウェーブレット (Wavelet) 変換

高周波成分はエッジ抽出(他に画像勾配法や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')

"Boat"
Boat

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は横方向、縦方向、斜め方向のエッジが抽出されているような画像が得られる。

"2Dウェーブレット変換(bior1.3)"
2Dウェーブレット変換(bior1.3)

3. 様々な基底関数による変換

基底関数をbior1.3以外に変更する場合は、例えばpywt.dwt2(gray, 'bior6.8')とする。これ以外はすべて同じコードで処理すると

"2Dウェーブレット変換(bior6.8)"
2Dウェーブレット変換(bior6.8)

bior1.3と比較して、より高周波のエッジが抽出されているように見える。実際に Wavelet Properties Browser のWavelet familiesで基底関数の形状を確認することができ、Biorthogonal 1.3 (Bior1.3)よりもBior6.8の方が関数形状が細かい。

他の基底関数でもいくつか試しに2Dウェーブレット変換した結果を示す。

ウェーブレットではよく使われるHarr関数では

"2Dウェーブレット変換(Harr)"
2Dウェーブレット変換(Harr)

離散的な形状のReverse Biorthogonal(rbio)関数では

"2Dウェーブレット変換(rbio1.3)"
2Dウェーブレット変換(rbio)

1次元の信号の例でよく取り上げられているdb2では

"2Dウェーブレット変換(db2)"
2Dウェーブレット変換(db2)

4. まとめ

今回は2Dウェーブレット変換の方法と画像にいくつかの基底関数を用いて適用した例について紹介した。