如何在 Matlab 中找到 DCT 的前 25 个系数?

信息处理 图像处理 matlab dct
2022-02-24 07:41:22

我首先需要25×25在 Matlab 中加密图像的 DCT 系数。

我如何获得它们?

我使用此代码来计算图像的 DCT:

I = imread('cameraman.tif');
I = im2double(I);
T = dctmtx(8);
dct = @(block_struct) T * block_struct.data * T';
B = blockproc(I,[8 8],dct);
mask = [1   1   1   1   0   0   0   0
    1   1   1   0   0   0   0   0
    1   1   0   0   0   0   0   0
    1   0   0   0   0   0   0   0
    0   0   0   0   0   0   0   0
    0   0   0   0   0   0   0   0
    0   0   0   0   0   0   0   0
    0   0   0   0   0   0   0   0];
B2 = blockproc(B,[8 8],@(block_struct) mask .* block_struct.data);
invdct = @(block_struct) T' * block_struct.data * T;
I2 = blockproc(B2,[8 8],invdct);
imshow(I), figure, imshow(I2)

我阅读的论文中的声明是:

基本结构:让V是一个维度的特征空间d(例如,空间Rd对应于数字图像的 DCT 左上角的条目,不包括 DC 分量)并考虑原始特征φ=(φ1,...,φd).

该论文还提供了一些实用细节,例如:

我们选择左上角作为特征空间25×25DCT 的系数(不包括 DC 分量)。

1个回答

在 JPEG 压缩中,DCT 系数通常不被解析为子块,而是按顺序解析:

对应于左上角的条目

这对应于锯齿形索引:

JPEG的之字形排序

这可以通过以下代码获得。在这里我使用8×8JPEG量化表,并提取5×5左上角的系数。顺便说一句,之间的双射2D坐标和之字形 1D坐标可以通过康托尔配对多项式获得(Matlab实现)。

% ExtractComponent
nCoomponent = 25;
quantTable = [    16,  11,  10,  16,  24,  40,  51,  61;
    12,  12,  14,  19,  26,  58,  60,  55;
    14,  13,  16,  24,  40,  57,  69,  56;
    14,  17,  22,  29,  51,  87,  80,  62;
    18,  22,  37,  56,  68, 109, 103,  77;
    24,  35,  55,  64,  81, 104, 113,  92;
    49,  64,  78,  87, 103, 121, 120, 101;
    72,  92,  95,  98, 112, 100, 103,  99];

index = zigzag(length(quantTable));
indexCrop = index(2:26);
quantTableCrop = zeros(size(quantTable));
quantTableCrop(indexCrop) = quantTable(indexCrop);

figure(1)
image(quantTable);
figure(2)
image(quantTableCrop);

和功能

function index = zigzag(size)

% ZIGZAG(size) returns the zigzag order index
% for a size x size square matrix

    index = 1:size*size;
    [j,i] =  meshgrid(1:size);
    i = i(:);
    j = j(:);
    iplusj = i + j;
    even_ind = (rem(iplusj,2) == 0);
    odd_ind = ~even_ind;
    j(even_ind) =   j(even_ind);
    j(odd_ind) =    i(odd_ind);
    [nouse,tags] = sortrows([iplusj,j]);
    index = index(tags);
end