gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:20:29 29 4
gpt4 key购买 nike

我是数字图像处理领域的初学者,最近我在一个项目中工作,必须使用DCT将图像分解为两个频率分量(即低和高)。我在网上进行了很多搜索,发现MATLAB有一个内置的离散余弦变换函数,其用法如下:

dct_img = dct2(img);


其中 img是输入图像, dct_imgimg的最终DCT。



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

最佳答案

正如您提到的,dct2idct2将为您完成大部分工作。那么剩下的问题是:什么是高频,什么是低频含量?二维变换后的系数实际上将分别代表两个频率(一个在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的注意事项:下三角函数相对于数学对角线(从左上角到右下角)起作用,因为我想要另一个对角线,然后在前后翻转。

还要注意,这种操作通常不应用于整个图像,而是应用于例如8x8。看一下 blockprocthis article

关于matlab - 使用DCT将图像分解为两个频率分量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22322427/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com