小波变换

信息处理 图片 图像处理
2021-12-25 11:19:21

我想对图像执行 2D haar 离散小波变换和逆 DWT。请您用一种简单的语言和一种算法解释二维 haar 离散小波变换和逆 DWT,我可以使用该算法编写二维 haar dwt 的代码?谷歌提供的信息太技术性了。我理解基本的东西,比如将图像分成 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();
        }
    }
}

输出是黑色图像,中间有一条细线,总之与实际输出相去甚远。我认为我的逻辑解释错误。请指出错误。问候

2个回答

请您用简单的语言解释一下 2D haar 离散小波变换和逆 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 轴的相同范围(这就是每个轴有两个低点和两个高点的原因)

以及一种算法,我可以使用它来编写二维 haar dwt 的代码?

您必须真正尝试从基本原则自己编写代码,以便了解整个过程。很容易找到一段现成的代码来完成您正在寻找的工作,但我不确定这是否真的会对您长期有所帮助。

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

这是从傅立叶变换的角度考虑 DWT 真正“值得”的地方。原因如下:

在傅里叶变换(当然还有 DCT)中,您将许多样本(在时域中)转换为一个(复数)系数(在频域中)。这是因为,您构建了不同的正弦曲线和余弦曲线,然后将它们与信号相乘并获得该乘积的平均值。因此,您知道单个系数 Ak 代表信号中某个频率 (k) 的正弦曲线的缩放版本。

现在,如果您查看一些小波函数,您会注意到它们比简单的正弦曲线要复杂一些。例如,考虑高通哈尔滤波器的傅里叶变换...高通哈尔滤波器看起来像一个方波,即它具有尖锐的边缘(尖锐的过渡)...创建 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(吉尔伯特·斯特朗)

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

我希望这有帮助

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

我在@A_A的答案之前开始写这个,但这个答案非常好。我仍然希望以下内容可以对您的理解有所帮助。

关于小波等的讨论属于关于信号基分解的一般讨论。通过这个,我们的意思是我们可以代表我们的信号x作为一些基矩阵的乘积,H,以及在替代基(基分解)中表示我们的信号的向量,x~. 那是:

x=Hx~
基矩阵H通常是一个正交矩阵(例如离散傅立叶矩阵、Haar 小波矩阵),但不一定是 - 整个研究领域都在研究将信号分解为过完备字典,这意味着H比高度更宽(例如,通过最小 L1 范数算法)。

信号基分解背后的想法是,信号可以以某种更好的方式在替代基中表示。更好,我们的意思是信号在某种程度上更易于处理,或理解,或其他- 这并不重要。

需要注意的一点是,特别是对于正交变换,你的信号仍然是你的信号,无论它是在什么基础上。你不应该认为一个基础是正确的域(我使用域来表示一般意义上的基础) .

现在,不同的碱基有不同的性质。我相信你很清楚描述傅里叶域和时域之间有用关系的卷积定理。这使得傅里叶域对于执行时域卷积操作很有用。

一般来说,时间(或像素)域可以被认为具有出色的时间(或空间)分辨率和较差的频率分辨率。相反,傅立叶域可以被认为具有出色的频率分辨率和较差的时间(或空间)分辨率。

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

不同的小波具有不同的性质。除了来自@A_A 的参考资料之外,我还推荐这个关于 DTCWT 的IEEE 教程。本教程的重点不是小波变换本身,而是我推荐它的原因是因为它对与 DWT 相关的问题以及如何缓解这些问题提供了奇妙的洞察力(我想说这需要基本的了解首先虽然)。它将对小波的理解与对傅里叶变换的理解联系在一起,以及为什么后者具有它所具有的良好特性。

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