我是一个数字图像处理领域的初学者,最近我正在做一个项目,在这个项目中,我必须使用DCT将图像分解成两个频率分量,即(低和高)。我在网上搜索了很多,我发现MATLAB对离散余弦变换有一个内置的函数,如下所用:
dct_img = dct2(img);其中img是输入图像,dct_img是img的合成DCT。
问题
我的问题是,“如何将dct_img分解成两个频率分量,即低频分量和高频分量”。
发布于 2014-03-13 21:22:16
正如您所提到的,dct2和idct2将为您完成大部分工作。剩下的问题是:什么是高频,什么是低频内容?二维变换后的系数实际上代表两个频率(一个在x中,一个在y方向上)。下面的图显示了8x8 离散余弦变换中每个系数的基数


因此,低与高的问题可以用不同的方式来回答。一种常见的方法,也是在JPEG编码中使用的,从零频率下降到最大,如上面所示。正如我们在下面的例子中所看到的,这主要是因为自然图像主要位于“低”频率的“左上角”。当然值得看一看dct2的结果,并与您的地区的实际选择高和低。
在下面,我是对角除以频谱,并绘制DCT系数-在对数尺度,因为否则,我们只会看到一个大的峰值围绕(1,1)。在这个例子中,我切割了一半以上的系数(用cutoff调节),我们可以看到高频部分("HF")仍然包含一些相关的图像信息。如果您将cutoff设置为0或以下,则只会留下小幅度的噪声。

%// 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的块。看看blockproc和这篇文章。
发布于 2014-03-11 11:06:05
一个简单的例子:
I2 = dct_img;
I2(8:end,8:end) = 0;
I3 = idct2(I2);
imagesc(I3)I3可以看作是经过低通滤波器(低频分量)后的图像,然后idct2(dct_img - I2)可以被看作是高频。
https://stackoverflow.com/questions/22322427
复制相似问题