使用DCT将图像分解为两个频率分量?

3

我是数字图像处理领域的初学者,最近我正在一个需要将图像分解为两个频率成分(低频和高频)的项目中使用DCT。我在网上搜索了很多资料,发现MATLAB有一个内置函数可以进行离散余弦变换:

``` matlab dct2(image) ```

此命令将对输入的图像执行DCT,返回已分解为低频和高频分量的图像。

dct_img = dct2(img);

其中img是输入图像,dct_imgimg的离散余弦变换结果。

问题

我的问题是,“我如何将dct_img分解成两个频率分量,即低频和高频分量”。


2
请给出你们的评论,投反对票的人,这对我来说是一个困难的问题,但希望对你们不是。 :) - Mayank Tiwari
2
不是我给你点踩的,但我猜你在 DSP 论坛里发了重复帖子。无论如何,这是一个关于基础知识的好问题,加一。谢谢。 - lennon310
2个回答

13

正如你所提到的,dct2idct2将为您完成大部分工作。 那么剩下的问题就是:什么是高频内容,什么是低频内容? 二维变换后的系数实际上将表示每个频率的两个频率(一个在x方向,一个在y方向)。以下figure显示了8x8 离散余弦变换中每个系数的基础:

因此,低频与高频的问题可以用不同的方式回答。一种常见的方式是沿着从零到最大的对角线进行,这也是JPEG编码中使用的方式。正如我们在下面的例子中所看到的那样,这主要是因为自然图像主要位于“低”频率的“左上角”。当然值得看看dct2的结果,并尝试实际选择高低区域。
接下来,我将对光谱进行对角线划分,并绘制DCT系数-以对数比例尺绘制,否则我们只会看到一个围绕(1,1)的大峰值。在本例中,我削减了超过一半的系数(可通过cutoff进行调整),我们可以看到高频部分(“HF”)仍包含一些相关的图像信息。如果将cutoff设置为0或更低,则只会剩下小幅噪声。

Results

%// Load an image
Orig = double(imread('rice.png'));
%// Transform
Orig_T = dct2(Orig);
%// Split between high- and low-frequency in the spectrum (*)
cutoff = round(0.5 * 256);
High_T = fliplr(tril(fliplr(Orig_T), cutoff));
Low_T = Orig_T - High_T;
%// Transform back
High = idct2(High_T);
Low = idct2(Low_T);

%// Plot results
figure, colormap gray
subplot(3,2,1), imagesc(Orig), title('Original'), axis square, colorbar 
subplot(3,2,2), imagesc(log(abs(Orig_T))), title('log(DCT(Original))'),  axis square, colorbar

subplot(3,2,3), imagesc(log(abs(Low_T))), title('log(DCT(LF))'), axis square, colorbar
subplot(3,2,4), imagesc(log(abs(High_T))), title('log(DCT(HF))'), axis square, colorbar

subplot(3,2,5), imagesc(Low), title('LF'), axis square, colorbar
subplot(3,2,6), imagesc(High), title('HF'), axis square, colorbar

(*) 关于tril的说明:下三角函数是相对于数学对角线从左上到右下操作的,因为我想要另一个对角线,所以在之前和之后进行左右翻转。
另外请注意,这种操作通常不适用于整个图像,而是适用于例如8x8的块。请查看blockprocthis article

1
@mbschenkel,这对于大小为MxN的图像也适用吗?(其中M不等于N) - Mayank Tiwari
2
@MayankTiwari:从概念上讲,这与图像大小无关,特别是如果您按照最后一句中提到的子块操作。然后,您只需要将其分解为m*n个正方形子块,使得M=K*m,N=K*n。但是,具体的代码仅作为说明编写,并且可能不适用于一般情况。这是您提出问题的原因吗? - mbschenkel

4
一个简单的例子:
I2 = dct_img;
I2(8:end,8:end) = 0;
I3 = idct2(I2);
imagesc(I3)

I3 可以看作是低通滤波器处理过的图像(即低频部分),然后 idct2(dct_img - I2) 可以视为高频部分。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接