離散 ウェーブレット 変換 画像 処理
この資料は、著作権の保護期間中か著作権の確認が済んでいない資料のためインターネット公開していません。閲覧を希望される場合は、国立国会図書館へご来館ください。 > デジタル化資料のインターネット提供について 「書誌ID(国立国会図書館オンラインへのリンク)」が表示されている資料は、遠隔複写サービスもご利用いただけます。 > 遠隔複写サービスの申し込み方 (音源、電子書籍・電子雑誌を除く)
- 離散ウェーブレット変換の実装 - きしだのHatena
- ウェーブレット変換(1) - 元理系院生の新入社員がPythonとJavaで色々頑張るブログ
- 画像処理のための複素数離散ウェーブレット変換の設計と応用に関する研究 - 国立国会図書館デジタルコレクション
離散ウェーブレット変換の実装 - きしだのHatena
More than 5 years have passed since last update. ちょっとウェーブレット変換に興味が出てきたのでどんな感じなのかを実際に動かして試してみました。
必要なもの
以下の3つが必要です。pip などで入れましょう。
PyWavelets
numpy
PIL
簡単な解説
PyWavelets というライブラリを使っています。
離散ウェーブレット変換(と逆変換)、階層的な?ウェーブレット変換(と逆変換)をやってくれます。他にも何かできそうです。
2次元データ(画像)でやる場合は、縦横サイズが同じじゃないと上手くいかないです(やり方がおかしいだけかもしれませんが)
サンプルコード
# coding: utf8
# 2013/2/1
"""ウェーブレット変換のイメージを掴むためのサンプルスクリプト
Require: pip install PyWavelets numpy PIL
Usage: python
ウェーブレット変換(1) - 元理系院生の新入社員がPythonとJavaで色々頑張るブログ
多くの、さまざまな正弦波と副正弦波(!) したがって、ウェーブレットを使用して信号/画像を表現すると、1つのウェーブレット係数のセットがより多くのDCT係数を表すため、DCTの正弦波でそれを表現するよりも多くのスペースを節約できます。(これがなぜこのように機能するのかを理解するのに役立つかもしれない、もう少し高度ですが関連するトピックは、 一致フィルタリングです )。 2つの優れたオンラインリンク(少なくとも私の意見では:-)です。: // および; 個人的に、私は次の本が非常に参考になりました:: //Mallat)および; Gilbert Strang作) これらは両方とも、この主題に関する絶対に素晴らしい本です。 これが役に立てば幸い (申し訳ありませんが、この回答が少し長すぎる可能性があることに気づきました:-/)
画像処理のための複素数離散ウェーブレット変換の設計と応用に関する研究 - 国立国会図書館デジタルコレクション
times do | i | i1 = i * ( 2 ** ( l + 1)) i2 = i1 + 2 ** l s = ( data [ i1] + data [ i2]) * 0. 5 d = ( data [ i1] - data [ i2]) * 0. 5 data [ i1] = s data [ i2] = d end 単純に、隣り合うデータの平均値を左に、差分を右に保存する処理を再帰的に行っている 3 。 元データとして、レベル8(つまり256点)の、こんな$\tanh$を食わせて見る。 M = 8 N = 2 ** M data = Array. new ( N) do | i | Math:: tanh (( i. to_f - N. to_f / 2. 0) / ( N. to_f * 0. 1)) これをウェーブレット変換したデータはこうなる。 これのデータを、逆変換するのは簡単。隣り合うデータに対して、差分を足したものを左に、引いたものを右に入れれば良い。 def inv_transform ( data, m) m. times do | l2 | l = m - l2 - 1 s = ( data [ i1] + data [ i2]) d = ( data [ i1] - data [ i2]) 先程のデータを逆変換すると元に戻る。 ウェーブレット変換は、$N$個のデータを$N$個の異なるデータに変換するもので、この変換では情報は落ちていないから可逆変換である。しかし、せっかくウェーブレット変換したので、データを圧縮することを考えよう。 まず、先程の変換では平均と差分を保存していた変換に$\sqrt{2}$をかけることにする。それに対応して、逆変換は$\sqrt{2}$で割らなければならない。 s = ( data [ i1] + data [ i2]) / Math. sqrt ( 2. 0) d = ( data [ i1] - data [ i2]) / Math. 0) この状態で、ウェーブレットの自乗重みについて「上位30%まで」残し、残りは0としてしまおう 4 。 transform ( data, M) data2 = data. ウェーブレット変換(1) - 元理系院生の新入社員がPythonとJavaで色々頑張るブログ. map { | x | x ** 2}. sort. reverse th = data2 [ N * 0.
という情報は見えてきませんね。 この様に信号処理を行う時は信号の周波数成分だけでなく、時間変化を見たい時があります。 しかし、時間変化を見たい時は フーリエ変換 だけでは解析する事は困難です。 そこで考案された手法がウェーブレット変換です。 今回は フーリエ変換 を中心にウェーブレット変換の強さに付いて触れたので、 次回からは実際にウェーブレット変換に入っていこうと思います。 まとめ ウェーブレット変換は信号解析手法の1つ フーリエ変換 が苦手とする不規則な信号を解析する事が出来る
new ( "L", ary. shape)
newim. putdata ( ary. flatten ())
return newim
def wavlet_transform_to_image ( gray_image, level, wavlet = "db1", mode = "sym"):
"""gray画像をlevel階層分Wavelet変換して、各段階を画像表現で返す
return [復元レベル0の画像, 復元レベル1の画像,..., 復元レベル