绘制图像DCT系数直方图面临的问题

信息处理 图像处理 matlab 信号分析 图像压缩
2022-02-04 15:43:43

在数字图像取证中,假设未压缩自然图像的DCT系数直方图具有平滑直方图。然而,压缩自然图像的 DCT 系数直方图存在峰值和间隙。在这项工作中讨论了一个这样的问题请参阅此图像以获得更好的理解DCT 系数的直方图

我正在使用以下 MATLAB 代码绘制未压缩和压缩图像的 DCT 系数直方图。

x_axis = -1000:0.01:1000;

img_1 = rgb2gray(imread('a.tif'));
img_2 = rgb2gray(imread('b.tif'));

subplot(2,2,1), imshow(img_1), title('Image');
subplot(2,2,2), imshow(img_2), title('Compressed Image');
subplot(2,2,3), plot(x_axis, histogram(dct2(double(img_1)))), title('Image');
subplot(2,2,4), plot(x_axis, histogram(dct2(double(img_2)))), title('Compressed Image');

但我无法以所需的方式获得结果。见下图我得到的结果

谁能解释一下?绘制图像DCT系数直方图的正确方法是什么,以便我可以获得正确的结果?

1个回答

我的猜测是断言

“未压缩自然图像的DCT系数直方图具有平滑直方图......但是,压缩自然图像的DCT系数直方图具有峰值和间隙。”

当使用使用 DCT(离散余弦变换)并量化(充分)其系数的压缩方法时有效。对于与 JPEG/MPEG 原则不同、使用 2D DCT 的压缩方法,这可能不会发生。块应用 DCT2 ,并且 DC 系数经历了与其他 AC 系数不同的预测压缩方案。8×8

因此,当您将 DCT 应用于整个图像而不是块时,您没有观察到量化,我并不感到惊讶(我获得了相同的结果)。

更成功的方法是比较原始和压缩的 块中的每一个上的 DCT 系数直方图(去除 DC 系数),然后组合所有块的系数。这是一个尝试,在 Matlab 中。8×8

DCT 系数的直方图

如您所见,由于量化,您现在在右侧直方图中有孔。

nBin = 512;
dctCoeffLimit = 80;

img_1 = double(rgb2gray(imread('lena.bmp')));
img_2 = double(rgb2gray(imread('lena.jpg')));

% Compute block DCT with mean removed 
funDCT2 = @(block_struct) dct2(block_struct.data-mean(mean((block_struct.data))));
img_1DCT= (blockproc(img_1,[8 8],funDCT2));
img_2DCT= (blockproc(img_2,[8 8],funDCT2));

% Set DC coefficients to NaN
img_1DCT(1:8:end,1:8:end) = nan;
img_2DCT(1:8:end,1:8:end) = nan;

% Convert 2D to 1D
img_1DCTflat = img_1DCT(:);
img_2DCTflat = img_2DCT(:);

% Remove DC (NaN) values
img_1DCTflat(isnan(img_1DCTflat)) = [];
img_2DCTflat(isnan(img_2DCTflat)) = [];

subplot(1,2,1)
histogram(img_1DCTflat,nBin);axis([-dctCoeffLimit dctCoeffLimit 0 Inf]);
subplot(1,2,2)
histogram(img_2DCTflat,nBin);axis([-dctCoeffLimit dctCoeffLimit 0 Inf]);