Transformada Wavelet

9

Eu quero executar a transformação de wavelet discreta em 2D e o DWT inverso em uma imagem. Você poderia, por favor, explicar a transformação de wavelet discreta em 2D e o DWT inverso em uma linguagem simples e um algoritmo usando o qual eu posso escrever o código para o 2D em haar dwtAs informações fornecidas no google eram muito técnicas. Compreendi as coisas básicas, como dividir a imagem em quatro sub-bandas: LL, LH, HL, HH, mas não consigo entender como escrever um programa para executar DWT e IDWT em Também li que o DWT é melhor que o DCT, pois é executado na imagem como um todo e, em seguida, houve uma explicação que passou por cima da minha cabeça.Pode estar errado aqui, mas acho que as técnicas de compressão DWT e DCT porque o tamanho da imagem diminui quando DWT ou DCT é executado neles. Esperando que vocês compartilhem uma parte do seu conhecimento e aprimorem o meu conhecimento.

Obrigado

Re: Ele tem algo a ver com a imagem format.What é "valor de pixel" que é usado em DWT? Eu assumi que seja o valor rgb da imagem.

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

A saída é uma imagem preta com uma linha fina no meio, em suma, nem perto da saída real. Acho que interpretei a lógica de maneira errada. Por favor, aponte os erros. Saudações

user1320483
fonte
O código acima significa muito para mim, graças .. você pode por favor me fornecer o código java para o inverso do 2D Transformada de Haar

Respostas:

15

Você pode explicar a transformação discreta de wavelets em 2D e o DWT inverso em uma linguagem simples

É útil pensar na transformada wavelet em termos da Transformada Discreta de Fourier (por várias razões, veja abaixo). Na Transformação de Fourier, você decompõe um sinal em uma série de funções trigonométricas ortogonais (cos e sin). É essencial que eles sejam ortogonais para que seja possível decompor seus sinais em uma série de coeficientes (de duas funções que são essencialmente INDEPENDENTES uma da outra) e recomponha-os novamente.

Com esse critério de ortogonalidade em mente, é possível encontrar duas outras funções ortogonais além do cos e do pecado?

Sim, é possível criar essas funções com a característica útil adicional que elas não se estendem ao infinito (como o cos e o pecado). Um exemplo desse par de funções é o Haar Wavelet .

Agora, em termos de DSP, talvez seja mais prático pensar nessas duas "funções ortogonais" como dois filtros de Resposta Finita a Impulso (FIR) e a Transformada de Wavelet Discreta como uma série de Convoluções (ou, em outras palavras, aplicar esses filtros sucessivamente algumas séries temporais). Você pode verificar isso comparando e contrastando as fórmulas do DWT 1-D e da convolução .

De fato, se você observar as funções Haar de perto, verá os dois filtros passa-baixo e passa-alto mais elementares. Aqui está um filtro passa-baixas muito simples h = [0,5,0,5] (não se preocupe com a escala no momento) também conhecido como filtro de média móvel, porque basicamente retorna a média de cada duas amostras adjacentes. Aqui está um filtro passa-alto muito simples h = [1, -1], também conhecido como diferenciador, pois retorna a diferença entre duas amostras adjacentes.

Para executar o DWT-IDWT em uma imagem, basta usar as versões bidimensionais da convolução (para aplicar seus filtros Haar sucessivamente).

Talvez agora você possa começar a ver de onde vêm as partes LowLow, LowHigh, HighLow, HighHigh de uma imagem submetida a DWT. No entanto, observe que uma imagem já é DIMENSIONAL (talvez isso seja confuso algumas vezes). Em outras palavras, você deve derivar as frequências espaciais baixo-alto para o eixo X e os mesmos intervalos para o eixo Y (é por isso que existem dois baixos e dois altos por eixo)

e um algoritmo usando o qual eu posso escrever o código para 2D haar dwt?

Você realmente deve tentar codificá-lo por conta própria, desde os primeiros princípios, para entender melhor todo o processo. É muito fácil encontrar um pedaço de código pronto que fará o que você está procurando, mas não tenho certeza de que isso realmente o ajude a longo prazo.

Posso estar errado aqui, mas acho que as técnicas de compactação DWT e DCT porque o tamanho da imagem diminui quando o DWT ou DCT é executado nelas

É aqui que realmente "vale a pena" pensar no DWT em termos da Transformada de Fourier. Pelo seguinte motivo:

Na Transformação de Fourier (e, claro, também no DCT), você transforma MUITAS AMOSTRAS (no domínio do tempo) em UM (complexo) coeficiente (no domínio da frequência). Isso ocorre porque você constrói diferentes sinusóides e cosinusóides e depois os multiplica com o seu sinal e obtém a média desse produto. Então, você sabe que um único coeficiente Ak representa uma versão em escala de um sinusóide de alguma frequência (k) no seu sinal.

Agora, se você observar algumas das funções da wavelet, perceberá que elas são um pouco mais complexas do que os simples sinusóides. Por exemplo, considere a transformada de Fourier do filtro Haar passa-alto ... O filtro Haar passa-alto parece uma onda quadrada, ou seja, possui bordas afiadas (transições nítidas) ... O que é necessário para criar SHARP EDGES? .. ... Muitos, muitos sinusóides e co-sinusóides diferentes (!)

Portanto, representar seu sinal / imagem usando wavelets economiza mais espaço do que representá-lo com os sinusóides de um DCT, porque UM conjunto de coeficientes de wavelet representa MAIS COEFFICIENTS DCT. (Um tópico um pouco mais avançado, mas relacionado, que pode ajudar você a entender por que isso funciona dessa maneira é a Filtragem por correspondência ).

Dois bons links online (na minha opinião pelo menos :-)) são: http://faculty.gvsu.edu/aboufade/web/wavelets/tutorials.htm e; http://disp.ee.ntu.edu.tw/tutorial/WaveletTutorial.pdf

Pessoalmente, achei muito úteis os seguintes livros: http://www.amazon.com/A-Wavelet-Tour-Signal-Processing/dp/0124666051 (de Mallat) e; http://www.amazon.com/Wavelets-Filter-Banks-Gilbert-Strang/dp/0961408871/ref=pd_sim_sbs_b_3 (por Gilbert Strang)

Ambos são livros absolutamente brilhantes sobre o assunto.

Eu espero que isso ajude

(desculpe, acabei de perceber que esta resposta pode demorar um pouco demais: - /)

A_A
fonte
Estou em êxtase por você ter respondido. Obrigado por responder A_A. Com base na interpretação matemática do DWT que encontrei em um artigo do IEEE, escrevi um código. No entanto, tudo o que recebo é uma imagem em preto, por favor me ajude.
user1320483
Escrever o código para executar o DWT realmente significa muito para mim. (Por favor) ^ ∞.Eu ficarei muito agradecido. Publiquei o código acima.
user1320483
Há duas coisas a serem observadas no seu código: a) Revise a versão bidimensional da convolução (não é mais simples que a do caso atual) eb) Observe que sua "imagem" é um conjunto de coeficientes que podem seja muito pequeno ou muito grande e, de qualquer forma, esteja fora da faixa dinâmica comum de 255 cores. Portanto, você precisa encontrar o intervalo de seus coeficientes e escalá-lo para o intervalo 0,255. Você está indo apenas para um nível de decomposição?
um_um
a) Por favor, reveja a versão bidimensional da convolução (não é mais simples que a do caso). Não sei o que você quer dizer com isso. "imagem" é um conjunto de coeficientes que podem ser muito pequenos ou muito grandes e, em qualquer caso, fora do intervalo dinâmico comum de 255 cores. Isso significa que, após adicionar, tenho que verificar se o valor excede 255 e se começa com 0? Você está indo apenas para um nível de decomposição? Sim Muito obrigado
user1320483
O que quero dizer com (a) é que, se você deseja aplicar os filtros Haar (conforme a resposta acima), terá que revisar como isso é feito através da operação de convolução e, no caso dos filtros Haar, isso é muito simples. Sim, você precisa normalizar seus coeficientes no intervalo de 0 a 255 para poder "vê-los". No que diz respeito ao RGB, foque nas imagens em escala de cinza (apenas um valor). Você precisa entender primeiro o que precisa fazer e depois fazer. Procurar "o código" consumirá mais tempo a longo prazo.
um_um
8

Comecei a escrever isso antes da resposta de @A_A , mas essa resposta é excelente. Ainda espero que o seguinte possa adicionar um pouco à sua compreensão.

xHx~

x=Hx~
HH

A idéia por trás da decomposição básica do sinal é que o sinal pode ser representado de alguma maneira melhor em uma base alternativa. Ao melhor , queremos dizer que o sinal é de alguma forma mais favorável ao processamento, ou compreender, ou seja o que for - não importa realmente.

Um ponto a salientar é que, particularmente com as transformações ortonormais, o sinal ainda é o sinal que quer que base é. Você não deve pensar em uma base que de alguma forma ser o correto domínio (eu uso domínio para base média no sentido geral) .

Agora, bases diferentes têm propriedades diferentes. Tenho certeza de que você conhece bem o teorema da convolução que descreve a relação útil entre o domínio de Fourier e o domínio do tempo. Isso torna o domínio de Fourier útil para executar operações de convolução no domínio do tempo.

Em geral, o domínio do tempo (ou pixel) pode ser considerado como tendo excelente resolução de tempo (ou espacial) e resolução de frequência ruim. Por outro lado, o domínio de Fourier pode ser considerado como tendo excelente resolução de frequência e resolução de tempo ruim (ou espacial).

As bases da wavelet se encaixam em algum lugar no meio das duas acima. Eles tendem a ter boa resolução de frequência e bom tempo ou resolução espacial. Uma propriedade da transformada wavelet é a boa esparsificação das imagens naturais. Com isso, quero dizer que a energia da imagem é compactada em alguns coeficientes grandes e muitos coeficientes pequenos. Isso significa que a maioria das informações salientes do sinal é representada por um conjunto relativamente pequeno de valores. Essa é a essência da compressão.

Wavelets diferentes têm propriedades diferentes. Além das referências de @A_A, também recomendo este tutorial IEEE no DTCWT. O foco do tutorial não está na transformação da wavelet em si , mas a razão pela qual eu a recomendo é por causa da visão fantástica que ela apresenta sobre os problemas associados ao DWT e como eles podem ser aliviados (eu diria que requer um entendimento básico primeiro embora). Ele realmente une um entendimento de wavelets com um entendimento da transformada de Fourier e por que a última possui as boas propriedades que possui.

Se você quiser mais algum código de referência na transformação Haar, meu ex-supervisor tem alguns exemplos de matlab em sua página da web (o arquivo zip em "Curso de codificação de imagem 4F8", HAAR2D.M e IHAAR2D.M). Esses são muitos exemplos de ensino.

Henry Gomersall
fonte