Biến đổi rốn


9

Tôi muốn thực hiện chuyển đổi sóng con rời rạc 2D và DWT nghịch đảo trên một hình ảnh. Bạn có vui lòng giải thích biến đổi sóng con rời rạc 2D và DWT nghịch đảo trong một ngôn ngữ đơn giản và thuật toán sử dụng để tôi có thể viết mã cho 2D haar dwt? Thông tin được cung cấp trong google quá kỹ thuật. Tôi hiểu những điều cơ bản như chia hình ảnh thành 4 băng con: LL, LH, HL, HH nhưng tôi thực sự không thể hiểu cách viết chương trình để thực hiện DWT và IDWT trên một hình ảnh. Tôi cũng đọc rằng DWT tốt hơn DCT vì nó được thực hiện trên toàn bộ hình ảnh và sau đó có một số lời giải thích đã vượt qua đỉnh đầu của tôi. Tôi có thể sai ở đây nhưng tôi nghĩ rằng các kỹ thuật nén DWT và DCT bởi vì kích thước hình ảnh giảm khi DWT hoặc DCT được thực hiện trên chúng. Các bạn chia sẻ một phần kiến ​​thức của bạn và nâng cao kiến ​​thức của tôi.

Cảm ơn bạn

Re: Nó có liên quan gì đến định dạng hình ảnh không. "Giá trị pixel" được sử dụng trong DWT là gì? Tôi đã giả sử nó là giá trị rgb của hình ảnh.

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

Đầu ra là một hình ảnh màu đen với một đường mỏng ở giữa, ngắn không ở gần đầu ra thực tế. Tôi nghĩ rằng tôi đã hiểu sai logic. Xin vui lòng chỉ ra những sai lầm. Trân trọng



Đoạn mã trên có ý nghĩa rất lớn đối với tôi cảm ơn .. bạn có thể vui lòng cung cấp cho tôi mã java để nghịch đảo biến đổi

Câu trả lời:


15

Bạn vui lòng giải thích biến đổi sóng con rời rạc 2D và DWT nghịch đảo trong một ngôn ngữ đơn giản

Sẽ rất hữu ích khi nghĩ về biến đổi wavelet theo thuật ngữ Biến đổi Fourier rời rạc (vì một số lý do, vui lòng xem bên dưới). Trong Biến đổi Fourier, bạn phân tách tín hiệu thành một chuỗi các hàm lượng giác trực giao (cos và sin). Điều cần thiết là chúng phải trực giao để có thể phân tách tín hiệu của bạn theo một loạt các hệ số (của hai hàm về cơ bản là ĐỘC LẬP lẫn nhau) và tái lập lại nó.

Với tiêu chí về tính trực giao này trong tâm trí, liệu có thể tìm thấy hai chức năng khác là trực giao bên cạnh cos và sin?

Vâng, có thể đưa ra các chức năng như vậy với đặc tính hữu ích bổ sung mà chúng không mở rộng đến vô cùng (như cos và sin làm). Một ví dụ về cặp chức năng như vậy là Haar Wavelet .

Bây giờ, về mặt DSP, có lẽ thực tế hơn khi nghĩ về hai "chức năng trực giao" này như hai bộ lọc Phản hồi xung hữu hạn (FIR) và Biến đổi Wavelet rời rạc như một loạt các Kết hợp (hay nói cách khác, áp dụng các bộ lọc này liên tiếp qua một số chuỗi thời gian). Bạn có thể xác minh điều này bằng cách so sánh và đối chiếu các công thức của DWT 1-D và của tích chập .

Trong thực tế, nếu bạn chú ý đến các chức năng Haar, bạn sẽ thấy hai bộ lọc thông thấp và thông cao nhất cơ bản nhất. Dưới đây là bộ lọc thông thấp rất đơn giản h = [0,5,0,5] (đừng lo lắng về tỷ lệ hiện tại) còn được gọi là bộ lọc trung bình di động vì về cơ bản nó trả về trung bình của mỗi hai mẫu liền kề. Dưới đây là bộ lọc thông cao rất đơn giản h = [1, -1] còn được gọi là bộ phân biệt vì nó trả về sự khác biệt giữa bất kỳ hai mẫu liền kề nào.

Để thực hiện DWT-IDWT trên một hình ảnh, đó chỉ đơn giản là trường hợp sử dụng các phiên bản tích chập hai chiều (để áp dụng liên tục các bộ lọc Haar của bạn).

Có lẽ bây giờ bạn có thể bắt đầu thấy các phần LowLow, LowHigh, HighLow, HighHigh của một hình ảnh đã trải qua DWT đến từ đâu. TUY NHIÊN, xin lưu ý rằng một hình ảnh đã HAI LẦN (có thể điều này gây nhầm lẫn một số lần). Nói cách khác, bạn phải lấy được tần số Không gian Thấp-Cao cho trục X và cùng phạm vi cho trục Y (đây là lý do tại sao có hai Mức thấp và hai Mức cao trên mỗi trục)

và một thuật toán sử dụng mà tôi có thể viết mã cho 2D haar dwt?

Bạn phải thực sự cố gắng tự viết mã này từ các nguyên tắc đầu tiên để bạn hiểu được toàn bộ quá trình. Rất dễ dàng để tìm thấy một đoạn mã đã sẵn sàng sẽ làm những gì bạn đang tìm kiếm nhưng tôi không chắc chắn rằng điều này sẽ thực sự giúp bạn về lâu dài.

Tôi có thể sai ở đây nhưng tôi nghĩ các kỹ thuật nén DWT và DCT vì kích thước hình ảnh giảm khi DWT hoặc DCT được thực hiện trên chúng

Đây là nơi nó thực sự "trả tiền" khi nghĩ về DWT theo thuật ngữ Fourier Transform. Vì lý do sau:

Trong Biến đổi Fourier (và tất nhiên là cả DCT), bạn chuyển đổi NHIỀU MẪU (trong miền thời gian) thành hệ số ONE (phức tạp) (trong miền tần số). Điều này là do, bạn xây dựng các hình sin và cosin khác nhau và sau đó bạn nhân chúng với tín hiệu của bạn và thu được mức trung bình của sản phẩm đó. Vì vậy, bạn biết rằng một hệ số Ak đại diện cho một phiên bản thu nhỏ của một hình sin có tần số (k) trong tín hiệu của bạn.

Bây giờ, nếu bạn nhìn vào một số hàm sóng con, bạn sẽ thấy rằng chúng phức tạp hơn một chút so với các hình sin đơn giản. Ví dụ, hãy xem xét Biến đổi Fourier của Bộ lọc Haar High Pass ... Bộ lọc Haar vượt qua cao trông giống như một sóng vuông, tức là nó có các cạnh sắc nét (chuyển tiếp sắc nét) ... Cần gì để tạo ra ED EDGES? .. ... Nhiều, rất nhiều hình sin và đồng hình sin khác nhau (!)

Do đó, việc biểu thị tín hiệu / hình ảnh của bạn bằng wavelet giúp bạn tiết kiệm không gian hơn so với việc biểu thị nó bằng các hình sin của DCT vì MỘT bộ hệ số sóng con đại diện cho HỢP TÁC DCT HƠN. (Một chủ đề nâng cao hơn một chút nhưng có liên quan có thể giúp bạn hiểu lý do tại sao cách này hoạt động theo cách này là Lọc lọc phù hợp ).

Hai liên kết trực tuyến tốt (theo ý kiến ​​của tôi ít nhất là :-)) là: http://facemony.gvsu.edu/aboufade/web/wavelets/tutorials.htmlm và; http://disp.ee.ntu.edu.tw/tutorial/WaveletTutorial.pdf

Cá nhân, tôi đã tìm thấy rất hữu ích, các cuốn sách sau: http://www.amazon.com/A-Wavelet-Tour-Signal-Processing/dp/0124666051 (By Mallat) và; http://www.amazon.com/Wavelets-Filter-Banks-Gilbert-Strang/dp/0961408871/ref=pd_sim_sbs_b_3 (Tác giả Gilbert Strang)

Cả hai đều là những cuốn sách tuyệt vời về chủ đề này.

Tôi hi vọng cái này giúp được

(xin lỗi, tôi chỉ nhận thấy rằng câu trả lời này có thể chạy hơi lâu: - /)


Tôi ngây ngất vì bạn đã trả lời. Cảm ơn bạn đã trả lời A_A. Theo cách giải thích toán học của DWT mà tôi tìm thấy trong một bài báo của IEEE, tôi đã viết một mã. Tuy nhiên, tất cả những gì tôi nhận được là một hình ảnh màu đen, vui lòng giúp tôi.
dùng1320483

Viết mã để thực hiện DWT thực sự có ý nghĩa rất lớn đối với tôi. (Xin vui lòng) ^. Tôi sẽ rất biết ơn. Tôi đã đăng mã ở trên.
dùng1320483

Có hai điều cần lưu ý trong mã của bạn a) Vui lòng xem lại phiên bản tích chập hai chiều (không có gì đơn giản hơn trong trường hợp này) và b) Xin lưu ý rằng "hình ảnh" của bạn là một tập hợp các hệ số có thể rất nhỏ hoặc rất lớn và trong mọi trường hợp nằm ngoài dải động phổ biến gồm 255 màu. Do đó, bạn cần tìm phạm vi các hệ số của mình và chia tỷ lệ cho khoảng 0,255. Bạn chỉ đi cho một cấp độ phân hủy?
A_A

a) Vui lòng xem lại phiên bản tích chập hai chiều (không có gì đơn giản hơn trong trường hợp này) Tôi không chắc ý của bạn là gì. "hình ảnh" là một tập hợp các hệ số có thể rất nhỏ hoặc rất lớn và trong mọi trường hợp nằm ngoài phạm vi động phổ biến của 255 màu Điều này có nghĩa là sau khi thêm tôi phải kiểm tra xem giá trị có vượt quá 255 không và liệu nó có bắt đầu từ 0 không? Bạn chỉ đi cho một cấp độ phân hủy? Có Cảm ơn bạn rất nhiều
user1320483

Ý tôi là (a) là nếu bạn muốn áp dụng các bộ lọc Haar (theo câu trả lời được đưa ra ở trên), bạn sẽ phải xem lại cách thực hiện thông qua hoạt động tích chập và trong trường hợp bộ lọc Haar, điều này rất đơn giản. Có, bạn cần bình thường hóa các hệ số của mình trong phạm vi 0-255 để có thể "nhìn thấy" chúng. Đối với RGB, vui lòng tập trung vào hình ảnh thang độ xám (chỉ một giá trị). Trước tiên bạn cần hiểu những gì bạn cần làm và sau đó làm nó. Tìm kiếm "mã" sẽ tốn nhiều thời gian hơn trong thời gian dài.
A_A

8

Tôi bắt đầu viết bài này trước câu trả lời từ @A_A , nhưng câu trả lời đó thật tuyệt vời. Tuy nhiên, tôi hy vọng những điều sau đây có thể thêm một chút vào sự hiểu biết của bạn.

xHx~

x= =Hx~
HH

Ý tưởng đằng sau sự phân tách tín hiệu cơ bản là tín hiệu có thể được biểu diễn theo một cách nào đó tốt hơn trong một cơ sở thay thế. Bằng cách tốt hơn , chúng tôi có nghĩa là tín hiệu bằng cách nào đó có thể dễ dàng hơn để xử lý, hoặc hiểu hoặc bất cứ điều gì - nó không thực sự quan trọng.

Một điểm cần lưu ý là, đặc biệt với các biến đổi trực giao, tín hiệu của bạn vẫn là tín hiệu của bạn cho dù đó là cơ sở nào. Bạn không nên nghĩ về một cơ sở như một cách nào đó là miền chính xác (tôi sử dụng miền theo nghĩa chung) .

Bây giờ, các cơ sở khác nhau có tính chất khác nhau. Tôi chắc chắn rằng bạn biết rõ về định lý tích chập mô tả mối quan hệ hữu ích giữa miền Fourier và miền thời gian. Điều này làm cho miền Fourier hữu ích để thực hiện các hoạt động tích chập miền thời gian.

Nói chung, miền thời gian (hoặc pixel) có thể được coi là có độ phân giải thời gian (hoặc không gian) tuyệt vời và độ phân giải tần số xấu. Ngược lại, miền Fourier có thể được coi là có độ phân giải tần số tuyệt vời và độ phân giải thời gian (hoặc không gian) xấu.

Các cơ sở sóng con phù hợp với một nơi nào đó ở giữa của hai ở trên. Chúng có xu hướng có độ phân giải tần số tốt độ phân giải không gian hoặc thời gian tốt. Một đặc tính của biến đổi wavelet là sự phát tán tốt của hình ảnh tự nhiên. Bằng cách này, ý tôi là năng lượng từ hình ảnh được nén thành một vài hệ số lớn và nhiều hệ số nhỏ. Điều này có nghĩa là hầu hết các thông tin nổi bật của tín hiệu được biểu thị bằng một tập hợp các giá trị tương đối nhỏ. Đây là bản chất của nén.

Các sóng nhỏ khác nhau có tính chất khác nhau. Ngoài các tài liệu tham khảo từ @A_A, tôi cũng đề xuất hướng dẫn này của IEEE về DTCWT. Trọng tâm của hướng dẫn không phải là về biến đổi wavelet mỗi lần , nhưng lý do tôi khuyên nó là vì sự hiểu biết tuyệt vời mà nó trình bày về các vấn đề liên quan đến DWT và cách chúng có thể được giảm bớt (tôi muốn nói rằng nó đòi hỏi sự hiểu biết cơ bản đầu tiên mặc dù). Nó thực sự liên kết với nhau một sự hiểu biết về sóng con với sự hiểu biết về biến đổi Fourier và tại sao cái sau có các tính chất tốt đẹp mà nó làm.

Nếu bạn muốn có thêm một số mã tham chiếu về biến đổi Haar, người giám sát cũ của tôi có một số ví dụ về matlab trên trang web của anh ấy (tệp zip trong "Khóa học mã hóa hình ảnh 4F8", HAAR2D.M và IHAAR2D.M). Đây là những ví dụ giảng dạy rất nhiều mặc dù.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.