ウェーブレット変換


9

画像に対して2Dハール離散ウェーブレット変換と逆DWTを実行したい。2D haar離散ウェーブレット変換と逆DWTを簡単な言語で説明し、2D haar dwtのコードを記述できるアルゴリズムを説明してください?Googleで提供された情報は技術的すぎました。画像を4つのサブバンド(LL、LH、HL、HH)に分割するなどの基本的なことは理解しましたが、DWTおよびIDWTを実行するプログラムを作成する方法を本当に理解できません。画像全体として画像に対して実行されるため、DWTはDCTよりも優れていると読みましたが、頭上にいくつかの説明がありましたが、ここでは間違っているかもしれませんが、DWTとDCTの圧縮手法はDWTまたはDCTを実行すると画像サイズが小さくなるためです。皆さんが知識の一部を共有し、私の知識を強化することを願っています。

ありがとうございました

再:それは画像フォーマットと関係があります。DWTで使用される「ピクセルの値」とは何ですか?私はそれを画像のRGB値であると想定しています。

import java.awt.event.*;
import javax.swing.*;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import java.io.*;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileFilter;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.imageio.ImageIO;
import java.awt.*;
import java.lang.*;
import java.util.*;

class DiscreteWaveletTransform

{

    public static void main(String arg[])
    { DiscreteWaveletTransform dwt=new DiscreteWaveletTransform();
      dwt.initial();
    }


    static final int TYPE=BufferedImage.TYPE_INT_RGB;
    public void initial()
    {
    try{

        BufferedImage buf=ImageIO.read(new File("lena.bmp"));
        int w=buf.getWidth();
        int h=buf.getHeight();
        BufferedImage dwtimage=new BufferedImage(h,w,TYPE);
        int[][] pixel=new int[h][w];
        for (int x=0;x<h;x++)
        {
            for(int y=0;y<w;y++)
            {
                pixel[x][y]=buf.getRGB(x,y);


            }
        }
        int[][] mat =  new int[h][w];
        int[][] mat2 =  new int[h][w];

        for(int a=0;a<h;a++)
        {
            for(int b=0,c=0;b<w;b+=2,c++)
            {
                mat[a][c]    = (pixel[a][b]+pixel[a][b+1])/2;
                mat[a][c+(w/2)]  = Math.abs(pixel[a][b]-pixel[a][b+1]);
            }
        }
        for(int p=0;p<w;p++)
        {
            for(int q=0,r =0 ;q<h;q+=2)
            {
                mat2[r][p]   = (mat[q][p]+mat[q+1][p])/2;
                mat2[r+(h/2)][p] = Math.abs(mat[q][p]-mat[q+1][p]);
            }
        }
        for (int x=0;x<h;x++)
        {
            for(int y=0;y<w;y++)
            {
                dwtimage.setRGB(x,y,mat2[x][y]);
            }
        }
        String format="bmp";
        ImageIO.write(dwtimage,format, new File("DWTIMAGE.bmp"));
        }

        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}

出力は黒い画像で、その間に細い線があり、実際の出力の近くにはどこにもありません。論理を誤って解釈したと思います。間違いを指摘してください。よろしく


1
あなたは見つけることが離散画像にウェーブレット変換を適用する方法に有用。

上記のコードは、あなたが変換ハール私に2Dの逆のためのJavaコードを提供してくださいすることができます...私のおかげで多くのことを意味

回答:


15

2D haar離散ウェーブレット変換と逆DWTを簡単な言語で説明してください

ウェーブレット変換を離散フーリエ変換の観点から考えると便利です(いくつかの理由で、以下を参照してください)。フーリエ変換では、信号を一連の直交三角関数(cosおよびsin)に分解します。信号を一連の係数(本質的に互いに独立している2つの関数の)に分解し、再びそれを再構成できるように、それらが直交していることが不可欠です。

この直交性の基準を念頭に置いて、cosとsin以外に直交する他の2つの関数を見つけることは可能ですか?

はい、そのような関数は、それらが無限に拡張されない(cosやsinのように)追加の有用な特性を備えている可能性があります。このような関数のペアの1つの例は、Haar Waveletです。

DSPに関しては、これらの2つの「直交関数」を2つの有限インパルス応答(FIR)フィルターと見なし離散ウェーブレット変換を一連の畳み込み(つまり、これらのフィルターを連続して適用)と考えるのがおそらくより現実的です。いくつかの時系列にわたって)。これは、1-D DWTの式とたたみ込みの式を比較対照することで確認できます。

実際、Haar関数に注意すると、最も基本的な2つのローパスフィルターとハイパスフィルターが表示されます。これは非常に単純なローパスフィルターh = [0.5,0.5](当面のスケーリングについては気にしないでください)であり、隣接する2つのサンプルの平均を本質的に返すため、移動平均フィルターとも呼ばれます。これは非常に単純なハイパスフィルターh = [1、-1] です。これは、2つの隣接するサンプル間の差を返すため、微分器としても知られています。

画像に対してDWT-IDWTを実行するには、たたみ込みの2次元バージョンを使用するだけです(Haarフィルターを連続して適用するため)。

おそらく、DWTが行われた画像のLowLow、LowHigh、HighLow、HighHighの部分がどこから来ているのかを確認し始めることができます。ただし、画像はすでに2次元であることに注意してください(たまに混乱するかもしれません)。つまり、X軸の低-高空間周波数とY軸の同じ範囲を導出する必要があります(これが、軸ごとに2つの低と2つの高がある理由です)。

2Dハールdwtのコードを記述できるアルゴリズム

プロセス全体を理解できるように、これを最初の原則から自分でコーディングする試みを実際に行う必要があります。あなたが探していることを行う既製のコードを見つけるのは非常に簡単ですが、これが長期的に本当に役立つかどうかはわかりません。

私はここでは間違っているかもしれませんが、DWTまたはDCTを実行すると画像サイズが小さくなるため、DWTおよびDCT圧縮技術だと思います

これは、DWTをフーリエ変換の観点から考えると、本当に「負担」になります。次の理由により:

フーリエ変換(そしてもちろんDCTも)では、多数のサンプル(時間領域)を1つの(複素数)係数(周波数領域)に変換します。これは、異なる正弦波と余弦波を作成し、それらに信号を乗算して、その積の平均を取得するためです。したがって、単一の係数Akは、信号内のある周波数(k)の正弦波のスケーリングされたバージョンを表すことがわかります。

ここで、いくつかのウェーブレット関数を見ると、単純な正弦波よりも少し複雑であることがわかります。たとえば、ハイパスハールフィルターのフーリエ変換について考えてみましょう...ハイパスハールフィルターは方形波のように見えます。 ...多くの、さまざまな正弦波と副正弦波(!)

したがって、ウェーブレットを使用して信号/画像を表現すると、1つのウェーブレット係数のセットがより多くのDCT係数を表すため、DCTの正弦波でそれを表現するよりも多くのスペースを節約できます。(これがなぜこのように機能するのかを理解するのに役立つかもしれない、もう少し高度ですが関連するトピックは、一致フィルタリングです)。

2つの優れたオンラインリンク(少なくとも私の意見では:-)です。http: //faculty.gvsu.edu/aboufade/web/wavelets/tutorials.htm および; http://disp.ee.ntu.edu.tw/tutorial/WaveletTutorial.pdf

個人的に、私は次の本が非常に参考になりました:http : //www.amazon.com/A-Wavelet-Tour-Signal-Processing/dp/0124666051(Mallat)および; http://www.amazon.com/Wavelets-Filter-Banks-Gilbert-Strang/dp/0961408871/ref=pd_sim_sbs_b_3(Gilbert Strang作)

これらは両方とも、この主題に関する絶対に素晴らしい本です。

これが役に立てば幸い

(申し訳ありませんが、この回答が少し長すぎる可能性があることに気づきました:-/)


私はあなたが答えたことに有頂天です。A_Aと答えてくれてありがとう。IEEEの論文で見つけたDWTの数学的解釈に基づいて、コードを書きました。ただし、黒い画像しか得られないので、助けてください。
user1320483 2012

DWTを実行するコードを書くことは、私にとって本当に大きな意味があります。(お願い)^∞。本当に感謝します。上記のコードを投稿しました。
user1320483 2012

コードには2つの注意点があります。a)畳み込みの2次元バージョンを確認してください(この場合、それよりも簡単にはなりません)。b)「イメージ」は、次のような係数のセットであることに注意してください。非常に小さいか非常に大きく、いずれの場合も、255色の一般的なダイナミックレンジの範囲外です。したがって、係数の範囲を見つけて、間隔​​0,255にスケーリングする必要があります。1レベルの分解しかできないのですか?
A_A 2012

a)畳み込みの2次元バージョンを確認してください(この場合、それよりも単純になることはありません)これが何を意味するのかわかりません。「画像」は、非常に小さいか非常に大きい可能性のある係数のセットであり、いずれの場合も、255色の一般的なダイナミックレンジの範囲外です。つまり、追加後に、値が255を超えているかどうか、および0から始まるかどうかを確認する必要があります。1レベルの分解しかできないのですか?はいどうもありがとうございました
user1320483

(a)が意味することは、Haarフィルターを適用したい場合(上記の回答に従って)、これが畳み込み演算によってどのように行われるかを確認する必要があり、Haarフィルターの場合、これは非常にシンプル。はい、係数を0〜255の範囲に正規化して「見える」ようにする必要があります。RGBに関する限り、グレースケール画像(1つの値のみ)に焦点を当ててください。最初に何をする必要があるかを理解し、次にそれを行う必要があります。「コード」を探すのは、長い目で見るとより時間がかかるでしょう。
A_A 2012

8

@A_Aからの回答の前にこれを書き始めましたが、その回答は素晴らしいです。それでも以下があなたの理解に少し追加されることを願っています。

ウェーブレットなどに関する議論は、信号の基底分解に関する一般的な議論に分類されます。これにより、信号を表すことができますバツ いくつかの基底行列の積として、 H、および代替基底(基底分解)で信号を表すベクトル、 バツ。あれは:

バツ=Hバツ
基礎行列 H は通常、正規直交行列(たとえば、離散フーリエ行列、Haarウェーブレット行列)ですが、そうである必要はありません。信号を分解して、完全すぎる辞書に調べるという研究分野があります。 H 高さよりも広い(たとえば、最小のL1ノルムアルゴリズムによって)。

信号の基底分解の背後にある考え方は、信号を別の基底でより良い方法で表すことができるということです。することで、より良い、我々は信号が何らかの形でより多くの処理に適し、または理解する、またはであることを意味するものは何でも -それは本当に問題ではありません。

注意すべき点は、特に正規直交変換では、信号の根拠が何であれ、信号は依然として信号であるということです。1つの根拠が何らかの形で正しいドメインであるとは考えないでください(一般的な意味でドメインを意味するためにドメインを使用します)。 。

現在、異なるベースには異なるプロパティがあります。フーリエ領域と時間領域の間の有用な関係を説明する畳み込み定理をご存じだと思います。これにより、フーリエドメインが時間ドメインのたたみ込み演算を実行するのに役立ちます。

一般に、時間(またはピクセル)ドメインは、優れた時間(または空間)分解能と不良な周波数分解能を持つと見なすことができます。逆に、フーリエドメインは、優れた周波数分解能と悪い時間(または空間)分解能を持つと見なすことができます。

ウェーブレットベースは、上記の2つの中間のどこかに収まります。それらは、良好な周波数分解能良好な時間または空間分解能を持つ傾向があります。ウェーブレット変換の特性の1つは、自然画像の適切なスパース化です。これにより、画像からのエネルギーがいくつかの大きな係数と多くの小さな係数に圧縮されます。これは、信号の主要な情報のほとんどが比較的小さな値のセットで表されることを意味します。これが圧縮の本質です。

ウェーブレットごとにプロパティが異なります。@A_Aからの参照に加えて、DTCWT に関するこのIEEEチュートリアルもお勧めします。チュートリアルの焦点はウェーブレット変換自体ではありませんが、私が推奨するのは、DWTに関連する問題とそれらがどのように軽減されるかについての素晴らしい洞察(基本的な理解が必要だと思います)のためです最初に)。ウェーブレットの理解とフーリエ変換の理解を結びつけ、ウェーブレットが優れた特性を持っている理由を結び付けます。

Haar変換のリファレンスコードがさらに必要な場合は、私の前の監督者が彼のWebページにいくつかのmatlabの例を示しています(「4F8画像コーディングコース」の下のzipファイル、HAAR2D.MおよびIHAAR2D.M)。これらは非常に多くの教育例です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.