正如你所提到的,dct2
和idct2
将为您完成大部分工作。 那么剩下的问题就是:什么是高频内容,什么是低频内容? 二维变换后的系数实际上将表示每个频率的两个频率(一个在x方向,一个在y方向)。以下figure显示了8x8 离散余弦变换中每个系数的基础:
因此,低频与高频的问题可以用不同的方式回答。一种常见的方式是沿着从零到最大的对角线进行,这也是
JPEG编码中使用的方式。正如我们在下面的例子中所看到的那样,这主要是因为自然图像主要位于“低”频率的“左上角”。当然值得看看
dct2
的结果,并尝试实际选择高低区域。
接下来,我将对光谱进行对角线划分,并绘制DCT系数-以对数比例尺绘制,否则我们只会看到一个围绕
(1,1)
的大峰值。在本例中,我削减了超过一半的系数(可通过
cutoff
进行调整),我们可以看到高频部分(“HF”)仍包含一些相关的图像信息。如果将
cutoff
设置为
0
或更低,则只会剩下小幅噪声。
Orig = double(imread('rice.png'));
Orig_T = dct2(Orig);
cutoff = round(0.5 * 256);
High_T = fliplr(tril(fliplr(Orig_T), cutoff));
Low_T = Orig_T - High_T;
High = idct2(High_T);
Low = idct2(Low_T);
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的块。请查看
blockproc
和
this article。