我想在图像上执行2D haar离散小波变换和逆DWT,请以简单的语言和算法编写2D haar dwt的代码来解释2D haar离散小波变换和DWT逆吗?我在Google中了解技术方面的基本知识,例如将图像分为4个子带:LL,LH,HL,HH,但我真的不明白如何编写程序对图像执行DWT和IDWT。我还读到DWT比DCT更好,因为它是对整个图像执行的,然后在脑海中浮现出一些解释。我在这里可能是错的,但我认为DWT和DCT压缩技术是因为图像大小减少对它们执行DWT或DCT的时间。希望你们共享一部分知识并增强我的知识。

谢谢

Re:
可以吗?与图像格式有什么关系。DWT中使用的“像素值”是什么?我假设它是rgb val图像的图像。

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


输出是黑色图像,中间有一条细线,总之不接近实际输出。我想我已经解释了逻辑错误。请指出错误。
注意事项

评论

您可能会发现如何在图像上应用离散小波变换很有用。

上面的代码对我来说意味着很多。.您能为我提供2D haar逆变换的Java代码吗?

#1 楼


请您用一种简单的语言解释2D haar离散小波变换和逆向变换
DWT


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

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

是的,可以提出具有附加有用特征的此类函数,使它们不会扩展到无穷大(就像cos和sin一样)。哈尔小波就是这类函数的一个例子。

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

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

要在图像上执行DWT-IDWT,只需使用二维卷积(连续应用Haar滤波器)即可。

现在也许您可以开始了解LowLow的位置,经过DWT的图像的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)

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

我希望这对我们有帮助

(对不起,我刚刚注意到,这个答案可能也有一点用long:-/)

评论


$ \ begingroup $
我很高兴您回答。谢谢您答复A_A。基于在IEEE论文中发现的DWT的数学解释,我编写了代码。但是,我得到的只是一张黑色图像,请帮帮我。
$ \ endgroup $
–user1320483
2012年4月23日上午10:30

$ \ begingroup $
编写执行DWT的代码对我来说确实意义重大。(请)^∞。我将非常感激。我已经在上面发布了代码。
$ \ endgroup $
–user1320483
2012年4月23日在10:35



$ \ begingroup $
您的代码中有两点需要注意:a)请检查卷积的二维版本(在这种情况下,它没有比这更简单的了),并且b)请注意,您的“图像”是一个集合可能很小或很大并且在任何情况下都超出255种颜色的常见动态范围的系数。因此,您需要找到系数的范围并将其缩放到间隔0255。您只打算进行一个分解级别吗?
$ \ endgroup $
– A_A
2012年4月23日在10:57

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



$ \ begingroup $
我的意思是(a),如果您想应用Haar过滤器(按照上面给出的答案),则必须回顾如何通过卷积运算以及在Haar的情况下完成此操作过滤器这很简单。是的,您需要将系数归一化为0-255的范围,才能“看到”它们。就RGB而言,请专注于灰度图像(仅一个值)。您需要首先了解您需要做的然后再做。从长远来看,寻找“代码”将花费更多时间。
$ \ endgroup $
– A_A
2012年4月23日在12:33

#2 楼

我开始在@A_A的答案之前编写此代码,但该答案非常好。仍然希望以下内容对您有所了解。

关于小波等的讨论属于关于信号基分解的一般性讨论。这样,我们的意思是我们可以将信号$ \ mathbf {x} $表示为某些基础矩阵$ \ text {H} $以及表示替代信号的矢量(基础分解)的乘积, $ \ tilde {\ mathbf {x}} $。即:
$$
\ mathbf {x} = \ text {H} \ tilde {\ mathbf {x}}
$$
基本矩阵$ \ text { H} $通常是一个正交矩阵(例如离散傅立叶矩阵,Haar小波矩阵),但不必如此-整个研究领域都在研究将信号分解为超完备的字典,这意味着$ \ text {H} $比信号高一些(例如通过最小L1范数算法)。

信号基本分解的思想是,信号可以用更好的方式表示。更好的是,我们的意思是信号在某种程度上更适合处理,理解或其他任何事情,这实际上并不重要。无论基于什么基础,它仍然是您的信号。您不应该将某个基础视为某种正确的域(我一般用域来表示基础)。

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

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

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

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

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