我正在学习用于图像处理的小波理论。为了理解这个理论,我写了一个Matlab程序来分解一个黑白图像。该计划如下
Image = zeros(256, 256, 'uint8');
Image(101:200, 101:200) = 255;
figure; imshow(Image);
[cA1, cH1, cV1, cD1] = dwt2(Image, 'db1');
Image1 = [cA1, cH1; cV1, cD1];
figure; imshow(Image1, []);
[cA1, cH1, cV1, cD1] = dwt2(Image, 'db2');
Image1 = [cA1, cH1; cV1, cD1];
figure; imshow(Image1, []);
使用参数db1的第一次分解为所有小波系数生成零。黑白图像沿水平和垂直方向从0到255的过渡,并且应具有高频分量。为什么会产生零小波系数?如果我将参数从db1更改为db2,结果将在子带中显示水平和垂直线。
答案 0 :(得分:2)
如果您还记得,db1
是Haar Wavelet。 Haar小波采用局部窗口内的平均像素作为近似系数(或LL波段),或局部窗口内的像素的差异,用于细节系数(或LH,HL和HH)带)。
请注意,您指定的输入图像仅包含两种强度:0和255.此外,您在此图像中将方形网格设置为255,均匀形状。
对于自我控制,这是您的测试图像的样子:
方形图像中的这个均匀形状的对象重要,作为您没有获得细节图像(HL,LH和HH)的任何输出的原因的一部分。
可以直观地显示描述您为什么看到db2
而不是db1
的输出的最佳方式。
此幻灯片来自University of Toronto's CS 320: Introduction to Visual Computing course,具体来说是Discrete Wavelet Transform lecture:
您很清楚,当您拍摄2D DWT时,您会产生4张子图像,这些子图像的分辨率是原始图像的一半。 dwt2
的第一个输出是近似系数,其中每个输出像素是2×2窗口的平均值。其他输出(第二,第三和第四)是细节窗口,它在窗口内取两个像素,并在窗口中用另外两个像素减去这些像素。
因此,您不获取db1
输出的原因是因为您对细节图像的所有计算都将取消输出。具体来说,您将获得完全为0或完全为255的2 x 2窗口,并且在计算细节图像时,无论如何都会得到0的输出。您可以添加两个0值或两个255值,然后分别减去这两个0值或255个值,从而导致输出 0,无论。
db2
小波是一个更复杂的变换,它是非均匀系数的加权和,因此您肯定会得到细节图像的输出,而不仅仅是2 x 2窗口的简单差分。 / p>
我想强调的是,如果你的形状更加复杂,不均匀,db1
肯定不给你一个零输出。尝试使用MATLAB附带的任何测试图像,例如cameraman.tif
。
希望这有帮助!