小波变换


9

我想对图像执行2D haar离散小波变换和逆DWT。您能以一种简单的语言和一种算法来解释2D haar离散小波变换和DWT逆向算法,我可以使用该算法编写2D haar dwt的代码Google提供的信息太技术性了。我了解将图像划分为4个子带的基本操作:LL,LH,HL,HH,但我真的不明白如何编写程序来执行DWT和IDWT我还读到DWT比DCT更好,因为它是对整个图像执行的,然后有一些解释贯穿了我的头顶。我在这里可能是错的,但我认为DWT和DCT压缩技术因为对它们执行DWT或DCT时图像尺寸会减小。希望你们共享一部分知识并增强我的知识。

谢谢

回复:这与图像格式有什么关系。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逆变换的Java代码

Answers:


15

您能用一种简单的语言解释二维哈尔离散小波变换和逆DWT吗

根据离散傅立叶变换考虑小波变换很有用(出于多种原因,请参见下文)。在傅立叶变换中,将信号分解为一系列正交三角函数(cos和sin)。它们必须正交,以便可以将信号分解为一系列系数(两个函数基本上彼此独立),然后重新构成。

考虑到这个正交性准则,是否可能找到除cos和sin之外的两个正交函数?

是的,可以提出具有附加有用特征的函数,这些函数不会扩展到无穷大(就像cos和sin一样)。这种函数对的一个例子是Haar Wavelet

现在,就DSP而言,将这两个“正交函数”视为两个有限冲激响应(FIR)滤波器,而将离散小波变换视为一系列卷积(换句话说,相继应用这些滤波器)可能更为实用。在某些时间序列上)。您可以通过比较和对比一维DWT和卷积公式来验证这一点。

实际上,如果您密切注意Haar功能,您将看到两个最基本的低通和高通滤波器。这是一个非常简单的低通滤波器h = [0.5,0.5](暂时不用担心缩放),因为它实际上返回每两个相邻样本的平均值,所以也称为移动平均滤波器。这是一个非常简单的高通滤波器h = [1,-1],也称为微分器,因为它返回任意两个相邻样本之间的差。

要对图像执行DWT-IDWT,仅是使用卷积的二维版本(连续应用Haar滤波器)的情况。

也许现在您可以开始查看经过DWT的图像的LowLow,LowHigh,HighLow,HighHigh部分来自何处。但是,请注意,图像已经是二维的(也许有时会造成混淆)。换句话说,您必须导出X轴的低-高空间频率和Y轴的相同范围(这就是为什么每个轴有两个低点和两个高点的原因)

以及可以用来为2D haar dwt编写代码的算法?

您必须真正尝试从最初的原理上自己编写代码,以便您对整个过程有所了解。找到现成的代码可以满足您的需求非常容易,但是我不确定这从长远来看是否会对您有所帮助。

我在这里可能是错的,但我认为DWT和DCT压缩技术是因为在对它们执行DWT或DCT时图像大小会减小

这是真正根据傅立叶变换来考虑DWT的“付出”。由于以下原因:

在傅里叶变换(当然还有DCT)中,您将MANY SAMPLES(在时域中)转换为ONE(复数)系数(在频域中)。这是因为,您构造了不同的正弦曲线和余弦曲线,然后将它们乘以信号并获得该乘积的平均值。因此,您知道单个系数Ak表示信号中某个频率(k)的正弦曲线的缩放比例。

现在,如果您看一些小波函数,您会发现它们比简单的正弦波要复杂一些。例如,考虑高通Haar滤波器的傅立叶变换...高通Haar滤波器看起来像一个方波,即它具有尖锐的边缘(尖锐的过渡)...创建SHARP EDGES需要什么? ...许多不同的正弦曲线和正弦曲线(!)

因此,用小波表示信号/图像比用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(由Mallat提供);以及 http://www.amazon.com/Wavelets-Filter-Banks-Gilbert-Strang/dp/0961408871/ref=pd_sim_sbs_b_3(由Gilbert Strang提供)

这两本书都是关于该主题的绝妙书籍。

我希望这有帮助

(对不起,我刚刚注意到这个答案可能运行时间太长了:-/)


我很高兴收到您的回复。谢谢您答复A_A。基于我在IEEE论文中发现的DWT的数学解释,我编写了代码。但是,我得到的只是一张黑色图像,请帮帮我。
user1320483 2012年

编写代码以执行DWT确实对我来说意义重大。(请)^∞。我将非常感激,我已经在上面发布了代码。
user1320483 2012年

您的代码中有两点需要注意:a)请检查卷积的二维版本(在这种情况下,它没有比这简单的多了),并且b)请注意,您的“图像”是一组系数,可能会可以非常小或很大,并且在任何情况下都不能超过255种颜色的通用动态范围。因此,您需要找到系数的范围并将其缩放到间隔0255。您是否只打算进行一个分解级别?
2012年

a)请检查卷积的二维版本(在这种情况下,它没有比这更简单的了)。我不确定您的意思是什么。“图像”是一组可能很小或很大并且在任何情况下都超出255种颜色的通用动态范围的系数。这意味着添加后,我必须检查该值是否超过255,以及它是否从0开始?您是否只打算进行一个分解级别?是的,非常感谢您
user1320483 '04

我的意思是(a)是,如果您想应用Haar滤波器(按照上面给出的答案),则必须回顾如何通过卷积运算完成此操作,而对于Haar滤波器,这非常简单。是的,您需要将系数标准化为0-255的范围,以便能够“看到”它们。就RGB而言,请专注于灰度图像(仅一个值)。您需要先了解您需要做的然后再做。从长远来看,寻找“代码”将花费更多时间。
2012年

8

我开始在@A_A的答案之前写这个,但是这个答案很棒。不过,我希望以下内容对您的理解有所帮助。

关于小波等的讨论属于关于信号的基础分解的一般讨论。这样,我们的意思是我们可以将信号为某些基础矩阵的乘积,而将信号表示为替代基础(基础分解)的向量。也就是说: 基本矩阵通常是一个正交矩阵(例如离散傅立叶矩阵,Haar小波矩阵),但是需要并非如此-整个研究领域都在研究将信号分解为不完整的字典,这意味着 ħ X X = H ^ X ħ ħxHx~

x=Hx~
HH 宽于高(例如通过最小的L1范数算法)。

信号的基础分解背后的思想是,可以在替代基础上以某种更好的方式表示信号。通过更好的,我们是指信号在某种程度上更易于处理,或理解,或任何 -这其实并不重要。

需要注意的一点是,特别是在正交变换中,无论信号是基于什么基础,您的信号仍然是您的信号。您不应该将一个基础视为某种程度上正确的域(我一般用域来表示基础) 。

现在,不同的基础具有不同的属性。我敢肯定,您对描述傅立叶域和时域之间有用关系的卷积定理非常了解。这使得傅立叶域对于执行时域卷积运算很有用。

通常,时域(或像素)可被认为具有出色的时域(或空间)分辨率和较差的频率分辨率。相反,可以将傅立叶域视为具有出色的频率分辨率和不良的时间(或空间)分辨率。

小波基在以上两个的中间适合。它们往往具有良好的频率分辨率良好的时间或空间分辨率。小波变换的一个特性是自然图像的良好稀疏性。借此,我的意思是将图像的能量压缩为几个大系数和许多小系数。这意味着信号的大多数显着信息由相对较小的一组值表示。这就是压缩的本质。

不同的小波具有不同的性质。除了@A_A的引用以外,我还建议在DTCWT上阅读此IEEE教程。本教程的重点不是小波变换本身,而是我之所以推荐它的原因是因为它对DWT相关的问题以及如何缓解这些问题提出了奇妙的见解(我想这需要基本的了解。首先)。它实际上将对小波的理解与对傅立叶变换的理解以及为什么后者具有它的良好特性联系在一起。

如果您想要有关Haar变换的更多参考代码,我的前主管在他的网页上有一些Matlab示例(“ 4F8图像编码课程”下的zip文件,HAAR2D.M和IHAAR2D.M)。这些都是很多教学示例。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.