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