我是数字图像处理领域的初学者,最近我正在开展一个项目,我必须使用DCT将图像分解为两个频率成分,即(低和高)。我在网上搜索了很多,我发现MATLAB有一个用于离散余弦变换的内置函数,如下所示:
dct_img = dct2(img);
其中img
为输入图片,dct_img
为结果DCT img
。
问题
我的问题是,“如何将dct_img分解为两个频率成分,即低频和高频成分”。
答案 0 :(得分:12)
正如您所提到的,dct2
和idct2
将为您完成大部分工作。那么剩下的问题是:什么是高频,什么是低频内容?二维变换之后的系数实际上将代表两个频率(一个在x方向,一个在y方向上)。以下figure显示了8x8 discrete cosine transform中每个系数的基数:
因此,低和高的问题可以用不同的方式回答。如上所示,在JPEG encoding中也使用的常见方式从零频率向下对角线进行对角线。正如我们在下面的示例中看到的那样,主要是因为自然图像主要位于“低”频率的“左上角”。当然值得查看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
的注释:下三角函数关于从左上角到右下角的数学对角线操作,因为我想要另一个对角线我在左右前后翻转之后。
还要注意,这种操作通常不应用于整个图像,而是应用于例如块。 8×8。请查看blockproc
和this article。
答案 1 :(得分:3)
一个简单的例子:
I2 = dct_img;
I2(8:end,8:end) = 0;
I3 = idct2(I2);
imagesc(I3)
I3
可被视为低通滤波器(低频分量)后的图像,然后idct2(dct_img - I2)
可被视为高频。