웨이블릿 변환


9

이미지에서 2D Haar 이산 웨이블릿 변환 및 역 DWT를 수행하고 싶습니다. 간단한 언어로 2D Haar 이산 웨이블릿 변환 및 역 DWT를 설명하고 2D Haar dwt의 코드를 작성할 수있는 알고리즘을 설명해 주시겠습니까?구글에 제공된 정보는 너무 기술적인데, 이미지를 4 개의 서브 밴드 (LL, LH, HL, HH)로 나누는 것과 같은 기본적인 것들을 이해했지만 DWT와 IDWT를 수행하기 위해 프로그램을 작성하는 방법을 실제로 이해할 수는 없습니다 또한 DWT가 이미지에서 전체적으로 수행되므로 DCT보다 낫다는 것을 읽었으며 머리 위로 넘어간 설명이 있습니다. 여기서 잘못되었을 수도 있지만 DWT 및 DCT 압축 기술이라고 생각합니다. DWT 또는 DCT를 수행하면 이미지 크기가 줄어들 기 때문에 지식의 일부를 공유하고 지식을 향상시키기를 바랍니다.

감사합니다

Re : 이미지 형식과 관련이 있습니까? 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 Haar 변환의 역을위한 자바 코드를 제공해주세요.

답변:


15

간단한 언어로 2D Haar 이산 웨이블릿 변환 및 역 DWT를 설명해 주시겠습니까?

이산 푸리에 변환의 관점에서 웨이블릿 변환을 생각하는 것이 유용합니다 (여러 가지 이유로 아래를 참조하십시오). 푸리에 변환에서는 신호를 일련의 직교 삼각 함수 (cos 및 sin)로 분해합니다. 신호가 일련의 계수 (기본적으로 서로 독립적 인 두 함수 중)로 분해 될 수 있도록 직교하는 것이 필수적입니다.

이러한 직교성 기준을 염두에두고, 죄와 죄 외에 직교하는 다른 두 가지 기능을 찾을 수 있습니까?

그렇습니다. (cos와 sin처럼) 무한대로 확장되지 않는 추가적인 유용한 특성을 가진 그러한 기능을 생각해 낼 수 있습니다. 이러한 기능 쌍의 한 예는 Haar Wavelet 입니다.

이제 DSP의 관점에서이 두 직교 함수를 두 개의 유한 임펄스 응답 (FIR) 필터와 이산 웨이블릿 변환 으로 일련의 회선 (또는 다른 말로,이 필터를 연속적으로 적용 )으로 생각하는 것이 더 실용적 일 것입니다 일부 시계열 이상). 1-D DWT의 공식과 컨볼 루션 의 공식을 비교하고 대조하여이를 확인할 수 있습니다 .

실제로 Haar 기능을 면밀히 살펴보면 가장 기본적인 두 개의 저역 통과 및 고역 통과 필터가 표시됩니다. 다음은 이동 평균 필터 라고도하는 매우 간단한 저역 통과 필터 h = [0.5,0.5] (순간 스케일링에 대해 걱정하지 마십시오)는 인접한 두 샘플의 평균을 모두 반환하기 때문입니다. 여기서 [1 -1] 매우 단순한 하이 패스 필터 = H 인이라고도 미분기 는 임의의 두 개의 인접 샘플들 간의 차이를 리턴하기 때문이다.

이미지에서 DWT-IDWT를 수행하기 위해 단순히 2 차원 버전의 회선 (Haar 필터를 연속적으로 적용)을 사용하는 경우입니다.

아마도 이제 DWT를 거친 이미지의 LowLow, LowHigh, HighLow, HighHigh 부분이 어디에서 왔는지 알 수 있습니다. 그러나 이미지는 이미 2 차원입니다 (몇몇 혼란 스러울 수 있음). 다시 말해, X 축에 대해 낮은 공간 공간 주파수와 Y 축에 대해 동일한 범위를 도출해야합니다 (이로 인해 축당 두 개의 로우와 두 개의 하이가 있습니다)

그리고 2D haar dwt에 대한 코드를 작성할 수있는 알고리즘은 무엇입니까?

전체 프로세스를 이해하려면 첫 번째 원칙에서 직접 코드를 작성해보십시오. 당신이 찾고있는 것을 할 준비가 된 코드 조각을 찾는 것은 매우 쉽지만 이것이 장기적으로 실제로 당신을 도울 것이라고 확신하지 못합니다.

여기에 잘못되었을 수도 있지만 DWT 또는 DCT 압축 기술은 DWT 또는 DCT가 수행 될 때 이미지 크기가 줄어들 기 때문에 생각합니다.

여기서 푸리에 변환 (Fourier Transform)의 관점에서 DWT를 생각하면 실제로 "지불"합니다. 다음과 같은 이유로 :

푸리에 변환 (물론 DCT도 포함)에서 많은 샘플 (시간 도메인)을 ONE (복합) 계수 (주파수 도메인)로 변환합니다. 다른 정현파와 코사인 파이드를 구성한 다음 신호와 곱하여 해당 제품의 평균을 구하기 때문입니다. 따라서 단일 계수 Ak는 신호에서 일부 주파수 (k)의 정현파의 스케일 버전을 나타냅니다.

이제 웨이블릿 함수 중 일부를 살펴보면 간단한 정현파보다 약간 더 복잡하다는 것을 알 수 있습니다. 예를 들어, High Pass Haar 필터의 푸리에 변환 (Fourier Transform) ... 고역 Pass Haar 필터는 구형파처럼 보입니다. ... 많은 다양한 정현파와 공 정현파 (!)

따라서 웨이블릿을 사용하여 신호 / 이미지를 나타내는 것은 한 세트의 웨이블릿 계수가 더 많은 DCT 계수를 나타 내기 때문에 DCT의 정현파로 나타내는 것보다 더 많은 공간을 절약합니다. (이 방법이 왜 그렇게 작동하는지 이해하는 데 도움이 될 약간 고급이지만 관련있는 주제는 일치 필터링 )입니다.

두 가지 좋은 온라인 링크 (최소한 의견으로는 :-)는 다음 과 같습니다. 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 (By Mallat) and; http://www.amazon.com/Wavelets-Filter-Banks-Gilbert-Strang/dp/0961408871/ref=pd_sim_sbs_b_3 (Bilbert Strang)

이 두 가지는 주제에 대해 절대적으로 훌륭한 책입니다.

이게 도움이 되길 바란다

(죄송합니다, 나는이 답변이 너무 오래 실행될 수 있음을 알았습니다 :-/)


나는 당신이 대답하는 것에 황홀합니다 .A_A에게 답장을 보내 주셔서 감사합니다 .IEEE 논문에서 찾은 DWT의 수학적 해석에 근거하여 코드를 작성했습니다. 그러나 내가 얻는 모든 것은 검은 이미지입니다.
user1320483

DWT를 수행하기 위해 코드를 작성하는 것은 실제로 많은 것을 의미합니다. (Please) ^ ∞. 정말 감사하겠습니다. 위의 코드를 게시했습니다.
user1320483

코드에 두 가지 유의할 사항이 있습니다. a) 2 차원 버전의 컨볼 루션 (이 경우보다 간단하지는 않음)을 검토하십시오. b) "이미지"는 계수의 집합 일 수 있습니다 매우 작거나 크거나 어쨌든 255 색의 일반적인 다이나믹 레인지를 벗어납니다. 따라서 계수의 범위를 찾아 간격 0,255로 조정해야합니다. 한 단계의 분해 만 하시겠습니까?
A_A

a) 2 차원 버전의 컨볼 루션을 검토하십시오 (이 경우보다 간단하지는 않습니다). 나는 이것이 무엇을 의미하는지 잘 모르겠습니다. "이미지"는 매우 작거나 매우 큰 계수 세트이며 어떤 경우에도 255 색의 일반적인 동적 범위를 벗어난 경우입니다. 이는 추가 한 후 값이 255를 초과하는지 여부와 0에서 시작하는지 확인해야합니까? 한 단계의 분해 만 하시겠습니까? 예 대단히 감사합니다
user1320483

내가 (a)의 의미는 Haar 필터를 적용하려면 (위의 답변에 따라) 컨볼 루션 작업을 통해 어떻게 수행되는지 검토해야하며 Haar 필터의 경우 매우 중요합니다. 단순한. 예, 계수를 "볼"수 있도록 계수를 0-255 범위로 정규화해야합니다. RGB에 관한 한, 그레이 스케일 이미지 (단 하나의 값)에 초점을 맞추십시오. 먼저해야 할 일이 무엇인지 이해 한 다음해야합니다. "코드"를 찾는 것은 장기적으로 더 많은 시간이 소요될 것입니다.
A_A

8

@A_A 에서 답변을하기 전에 이것을 작성하기 시작 했지만 그 대답은 훌륭합니다. 여전히 다음 내용이 이해에 약간의 도움이되기를 바랍니다.

웨이블릿 등에 대한 논의는 신호의 기초 분해에 대한 일반적인 논의에 속합니다. 이것으로 우리는 신호를 표현할 수 있습니다엑스 기본 행렬의 곱으로 H, 대체 기준 (기본 분해)으로 신호를 나타내는 벡터, 엑스~. 그건:

엑스=H엑스~
기본 행렬 H 일반적으로 직교 정규 행렬 (예를 들어, 이산 푸리에 행렬, 하르 웨이블릿 행렬)이지만 반드시 그럴 필요는 없습니다. H 키가 큰 것보다 넓습니다 (예 : 최소 L1-norm 알고리즘을 통해).

신호의 기초 분해에 대한 아이디어는 신호가 대안적인 방식으로 더 나은 방식 으로 표현 될 수 있다는 것입니다. 하여 더 나은 , 우리는 신호가 어떻게 든 더 많은 처리 의무가, 또는 이해, 또는 것을 의미 무엇이든 - 정말 중요하지 않습니다.

주목할 점은, 특히 직교 정규 변환의 경우, 신호는 여전히 어떤 기반이든지 신호입니다. 한 기준을 어떻게 든 올바른 도메인 이라고 생각해서는 안됩니다 (도메인은 일반적인 의미에서 기본을 의미합니다). .

이제 다른 기지마다 다른 속성이 있습니다. 푸리에 영역과 시간 영역 사이의 유용한 관계를 설명하는 컨볼 루션 정리를 잘 알고있을 것입니다. 이는 푸리에 도메인을 시간 도메인 컨볼 루션 연산을 수행하는 데 유용하게 만듭니다.

일반적으로 시간 (또는 픽셀) 도메인은 우수한 시간 (또는 공간) 해상도 및 나쁜 주파수 해상도를 갖는 것으로 간주 될 수있다. 반대로, 푸리에 영역은 우수한 주파수 해상도 및 불량 시간 (또는 공간) 해상도를 갖는 것으로 간주 될 수 있습니다.

웨이블릿베이스는 위 두 개의 중간에 맞습니다. 그들은 좋은 주파수 해상도 좋은 시간 또는 공간 해상도 를 갖는 경향이 있습니다 . 웨이블릿 변환의 한 가지 속성은 자연 이미지의 좋은 희소 화입니다. 이것은 이미지의 에너지가 몇 개의 큰 계수와 많은 작은 계수로 압축됨을 의미합니다. 이것은 신호의 현저한 정보의 대부분이 상대적으로 작은 값 세트로 표현됨을 의미합니다. 이것이 압축의 본질입니다.

웨이블릿마다 속성이 다릅니다. @A_A의 참조 외에도 DTCWT 에서이 IEEE 자습서 를 권장 합니다 . 튜토리얼의 초점은 웨이블릿 변환 자체 가 아닙니다. 가 아니라 DWT와 관련된 문제와 그것들이 어떻게 완화 될 수 있는지에 대한 환상적인 통찰력 때문입니다 (기본 이해가 필요하다고 말합니다) 먼저). 그것은 실제로 푸리에 변환에 대한 이해와 후자가 왜 좋은 속성을 갖는지에 대한 웨이블릿에 대한 이해와 관련이 있습니다.

Haar 변환에 대한 참조 코드가 더 필요한 경우, 이전 전 관리자는 웹 페이지 ( "4F8 이미지 코딩 과정", HAAR2D.M 및 IHAAR2D.M의 zip 파일) 에 matlab 예제가 있습니다. 이것들은 많은 가르침의 예입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.