Dalgacık dönüşümü


9

Bir görüntü üzerinde 2D haar ayrık dalgacık dönüşümü ve ters DWT yapmak istiyorum. 2D haar ayrık dalgacık dönüşümü ve ters DWT'yi basit bir dilde ve 2D haar dwt için kod yazabileceğim bir algoritma ile açıklar mısınız?Google'da verilen bilgiler çok teknikti. Görüntüyü 4 alt gruba ayırmak gibi temel şeyleri anladım: LL, LH, HL, HH ama DWT ve IDWT gerçekleştirmek için nasıl bir program yazacağımı gerçekten anlayamıyorum Görüntüde bir bütün olarak yapıldığı için DWT'nin DCT'den daha iyi olduğunu da okudum ve sonra başımın üstünden geçen bazı açıklamalar vardı.Burada yanlış olabilirim ama bence DWT ve DCT sıkıştırma teknikleri çünkü üzerlerinde DWT veya DCT gerçekleştirildiğinde görüntü boyutu azalır. umarım bilginizin bir kısmını paylaşır ve bilgimi geliştirirsiniz.

Teşekkür ederim

Re: Görüntü formatı ile ilgili bir şey var mı? DWT kullanılan "piksel değeri" nedir? Ben görüntünün rgb değeri olarak kabul var.

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();
        }
    }
}

Çıktı, aralarında ince bir çizgi bulunan siyah bir görüntüdür, kısaca gerçek çıktının yakınında hiçbir yerde. Bence mantığı yanlış yorumladım. Lütfen hataları belirtin. Saygılarımızla



Yukarıdaki kod bana çok şey ifade ediyor teşekkürler .. lütfen bana 2D haar dönüşümünün tersi için java kodu verebilir misiniz

Yanıtlar:


15

2D haar ayrık dalgacık dönüşümü ve ters DWT'yi basit bir dilde açıklar mısınız?

Dalgacık dönüşümünü Ayrık Fourier Dönüşümü açısından düşünmek yararlıdır (birkaç nedenden dolayı lütfen aşağıya bakın). Fourier Dönüşümünde, bir sinyali bir dizi dik trigonometrik fonksiyona (cos ve sin) ayırırsınız. Ortogonal olmaları önemlidir, böylece sinyallerinizi bir dizi katsayıda (esasen birbirinden bağımsız olan iki fonksiyondan) ayrıştırıp tekrar kompoze edebilirsiniz.

Bu diklik kriteri göz önünde bulundurularak, cos ve günahın yanında dik olan diğer iki işlevi bulmak mümkün müdür?

Evet, sonsuzluğa (cos ve günah gibi) uzanmadıkları ek kullanışlı karakteristiklerle bu gibi işlevler bulmak mümkündür. Bu tür işlevlerin bir örneği Haar Dalgacıktır .

Şimdi, DSP açısından, bu iki "dikey fonksiyon" hakkında iki Sonlu Impulse Response (FIR) filtresi ve Ayrık Dalgacık Dönüşümü dizisini bir dizi Konvolüsyon olarak düşünmek (veya başka bir deyişle, bu filtreleri art arda uygulamak) bazı zaman serilerinde). 1-B DWT ve evrişim formüllerini karşılaştırarak ve zıtlaştırarak bunu doğrulayabilirsiniz .

Aslında, Haar işlevlerini yakından fark ederseniz, en temel iki düşük geçişli ve yüksek geçişli filtreyi göreceksiniz. Hareketli ortalama filtresi olarak da bilinen çok basit bir alçak geçiren filtre h = [0.5,0.5] (şu andaki ölçeklendirme hakkında endişelenmeyin), çünkü aslında her iki bitişik örneğin ortalamasını döndürür. Burada çok basit bir yüksek geçiş filtresi h = [1, -1] aynı zamanda farklılaştırıcı olarak da bilinir, çünkü iki bitişik örnek arasındaki farkı döndürür.

Bir görüntü üzerinde DWT-IDWT gerçekleştirmek için, basitçe evrişimin iki boyutlu versiyonlarının kullanılması söz konusudur (Haar filtrelerinizi art arda uygulamak için).

Belki şimdi DWT uygulanan bir görüntünün LowLow, LowHigh, HighLow, HighHigh bölümlerinin nereden geldiğini görmeye başlayabilirsiniz. ANCAK, bir görüntünün zaten İKİ BOYUTLU olduğunu unutmayın (belki bu bazen karışık olabilir). Başka bir deyişle, X ekseni için Düşük-Yüksek Uzamsal frekansları ve Y ekseni için aynı aralıkları türetmelisiniz (bu yüzden eksen başına iki Düşük ve iki Yüksek vardır)

ve hangi 2D haar dwt için kod yazabilirsiniz kullanarak bir algoritma?

Tüm süreci anlayabilmeniz için bunu ilk prensiplerden kendi başınıza kodlamaya çalışmalısınız. Aradığınızı yapacak hazır bir kod parçası bulmak çok kolaydır, ancak bunun gerçekten uzun vadede size yardımcı olacağından emin değilim.

Burada yanlış olabilir ama DWT ve DCT sıkıştırma tekniklerini düşünüyorum çünkü DWT veya DCT üzerlerinde gerçekleştirildiğinde görüntü boyutu azalıyor

DWT'yi Fourier Dönüşümü açısından düşünmek gerçekten "öder". Aşağıdaki nedenle:

Fourier Dönüşümünde (ve tabii ki DCT'de), MANY SAMPLES'i (zaman alanında) ONE (karmaşık) katsayısına (frekans alanında) dönüştürürsünüz. Bunun nedeni, farklı sinüzoidler ve cosinusoidler oluşturmanız ve daha sonra bunları sinyalinizle çarpmanız ve o ürünün ortalamasını elde etmenizdir. Böylece, tek bir katsayı Ak'ın sinyaldeki sinüzoidin ölçeklenmiş bir versiyonunu temsil ettiğini biliyorsunuz.

Şimdi, dalgacık işlevlerinden bazılarına bakarsanız, basit sinüzoidlerden biraz daha karmaşık olduklarını göreceksiniz. Örneğin, Yüksek Geçişli Haar Filtresinin Fourier Dönüşümü'nü düşünün ... Yüksek geçişli Haar filtresi kare bir dalga gibi görünür, yani keskin kenarları vardır (keskin geçişler) ... KESKIN KENARLARI oluşturmak için ne gerekir? .. ... Birçok, birçok farklı sinüzoid ve ko-sinüzoid (!)

Bu nedenle, sinyalinizi / görüntünüzü dalgacıklar kullanarak temsil etmek, bir DCT'nin sinüzoidleri ile temsil etmekten daha fazla alan kazandırır, çünkü ONE dalgacık katsayısı kümesi DAHA DCT KATSAYISINI temsil eder. (Bunun neden bu şekilde çalıştığını anlamanıza yardımcı olabilecek biraz daha gelişmiş ancak ilgili bir konu Eşleşen Filtreleme'dir ).

İki iyi çevrimiçi bağlantı (bence en azından :-)): http://faculty.gvsu.edu/aboufade/web/wavelets/tutorials.htm ve; http://disp.ee.ntu.edu.tw/tutorial/WaveletTutorial.pdf

Şahsen, aşağıdaki kitapları çok yararlı buldum: http://www.amazon.com/A-Wavelet-Tour-Signal-Processing/dp/0124666051 (Mallat tarafından) ve; http://www.amazon.com/Wavelets-Filter-Banks-Gilbert-Strang/dp/0961408871/ref=pd_sim_sbs_b_3 (Gilbert Strang tarafından)

Her ikisi de konuyla ilgili kesinlikle parlak kitaplar.

Umarım bu yardımcı olur

(üzgünüm, bu cevabın biraz fazla uzun süre çalıştığını fark ettim: - /)


Ben cevap verdiğiniz için kendimi memnunum.A_A'ya cevap verdiğiniz için teşekkür ederim.Bir IEEE gazetesinde bulduğum DWT'nin matematiksel yorumuna dayanarak bir kod yazdım.
user1320483

DWT yapmak için kod yazmak gerçekten benim için çok şey ifade ediyor. (Lütfen) ^ ∞ Gerçekten minnettar olacağım.Yukarıdaki kodu gönderdim.
user1320483

Kodunuzda iki nokta vardır: a) Lütfen evrişimin iki boyutlu versiyonunu gözden geçirin (bu durumda bundan daha basit olamaz) ve b) "Resminizin" bir dizi katsayı olduğunu unutmayın. çok küçük veya çok büyük ve her durumda 255 renk arasındaki ortak dinamik aralığın dışında olmalıdır. Bu nedenle, katsayılarınızın aralığını bulmanız ve 0,255 aralığına ölçeklendirmeniz gerekir. Sadece bir seviye ayrışma mı yapacaksın?
A_A

a) Lütfen evrişimin iki boyutlu versiyonunu gözden geçirin (bu durumda bundan daha basit olamaz) Bununla ne demek istediğinizden emin değilim. "image", çok küçük veya çok büyük olabilecek ve her durumda 255 renk arasındaki ortak dinamik aralığın dışındaki bir dizi katsayıdır. Bu, ekledikten sonra değerin 255'i aşıp aşmadığını ve 0'dan başlayıp başlamadığını kontrol etmem gerektiği anlamına gelir. Sadece bir seviye ayrışma mı yapacaksın? Evet Çok teşekkür ederim
user1320483

(A) ile kastettiğim, eğer Haar filtrelerini uygulamak istiyorsanız (yukarıda verilen cevaba göre), bunun evrişim çalışmasıyla nasıl yapıldığını gözden geçirmeniz gerekecek ve Haar filtreleri durumunda bu çok basit. Evet, katsayılarınızı "görebilmek" için 0-255 aralığına normalleştirmeniz gerekir. RGB ile ilgili olarak, lütfen gri tonlamalı görüntülere odaklanın (sadece bir değer). Önce ne yapmanız gerektiğini anlamanız ve sonra yapmanız gerekir. "Kod" aramak uzun vadede daha fazla zaman alacaktır.
A_A

8

Bunu @A_A'nın cevabından önce yazmaya başladım , ancak bu cevap mükemmel. Umarım aşağıdakiler anlayışınıza biraz katkıda bulunabilir.

Dalgacıklar vb. İle ilgili tartışma, sinyallerin temel ayrışması hakkındaki genel tartışmaya girer. Bununla, sinyalimizi temsil edebileceğimizi kastediyoruzx bazı temel matrislerin ürünü olarak, 'Hve sinyalimizi alternatif temelde temsil eden vektör (temel ayrışma), x~. Yani:

x='Hx~
Temel matris 'H tipik olarak ortonormal bir matristir (örn. ayrık Fourier matrisi, Haar dalgacık matrisi), ancak gerekmemektedir - sinyalleri aşırı tam sözlüklere ayrıştırma arayan tüm araştırma alanları vardır, yani 'H uzunluğundan daha geniş (örneğin, minimum L1-norm algoritmaları aracılığıyla).

Sinyalin temelde ayrışmasının ardındaki fikir, sinyalin alternatif bir temelde daha iyi bir şekilde temsil edilebilmesidir . By iyi , biz sinyal nedense daha işlemlerine elverişlidir veya anlamak ya olduğu anlamına neyse - gerçekten önemli değil.

Dikkat edilmesi gereken bir nokta, özellikle ortonormal dönüşümlerde, sinyalin hangi temelde olursa olsun hala sizin sinyalinizdir. Bir temeli bir şekilde doğru alan olarak düşünmemelisiniz ( alan adını genel anlamda ifade etmek için kullanıyorum) .

Şimdi, farklı bazlar farklı özelliklere sahiptir. Eminim Fourier alanı ile zaman alanı arasındaki yararlı ilişkiyi tanımlayan evrişim teoreminin farkındasınızdır. Bu, Fourier etki alanını zaman etki alanı evrişimi işlemlerini gerçekleştirmek için kullanışlı hale getirir.

Genel olarak zaman (veya piksel) alanı, mükemmel zaman (veya uzamsal) çözünürlüğe ve kötü frekans çözünürlüğüne sahip olarak kabul edilebilir. Tersine, Fourier alanının mükemmel frekans çözünürlüğüne ve kötü zaman (veya uzamsal) çözünürlüğe sahip olduğu düşünülebilir.

Dalgacık tabanları yukarıdaki ikisinin ortasında bir yere sığar. İyi frekans çözünürlüğüne ve iyi zaman veya uzamsal çözünürlüğe sahip olma eğilimindedirler . Dalgacık dönüşümünün bir özelliği, doğal görüntülerin iyi korunmasızlığıdır. Bununla, görüntüdeki enerjinin birkaç büyük katsayıya ve birçok küçük katsayıya sıkıştırıldığını kastediyorum. Bu, sinyalin göze çarpan bilgilerinin çoğunun nispeten küçük bir değer kümesi ile temsil edildiği anlamına gelir. Sıkıştırmanın özü budur.

Farklı dalgacıklar farklı özelliklere sahiptir. @A_A referanslarına ek olarak, DTCWT'deki bu IEEE eğitimini de öneriyorum . Öğreticinin odağı, kendiliğinden dalgacık dönüşümünde değil , ama tavsiye etmemin sebebi, DWT ile ilgili sorunlar ve nasıl hafifletilebileceği ile ilgili harika bir fikir çünkü (temel bir anlayış gerektirdiğini söyleyebilirim) ilk olsa). Fourier dönüşümünü ve dalganın neden güzel özelliklere sahip olduğunu anlayarak dalgacıkların anlaşılmasını gerçekten birbirine bağlar.

Haar dönüşümüyle ilgili daha fazla referans kodu istiyorsanız, eski amirimin web sayfasında bazı matlab örnekleri var ("4F8 Görüntü Kodlama Kursu", HAAR2D.M ve IHAAR2D.M altındaki zip dosyası). Bunlar çok fazla öğretici örnektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.