开发者

Quantize dct cofficents in matlab

开发者 https://www.devze.com 2022-12-30 22:50 出处:网络
hello i need to perform quantization to dct cofficents for an image, for a block size of 8*8 pixles开发者_StackOverflow in matlab. can you help me with the syntax, thank you.There is a built-in functi

hello i need to perform quantization to dct cofficents for an image, for a block size of 8*8 pixles开发者_StackOverflow in matlab. can you help me with the syntax, thank you.


There is a built-in function in MATLAB for DCT.

You need the signal processing tool box. Type 'ver' (without quotes) in the MATLAB command to see if you have it.

The code:

image = image; % define your image

[m,n] = size(image); % get size of your image

imvector = reshape(image, m*n, 1); % reshape your image to a vector to compute DCT

imdct = dct(imvector); % compute DCT 

imagedct = reshape(imdct,m,n); \ reshape result back to original form of your image


There is an example in the help file as well which is very nice:

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)


To quantize DCT coefficients, you simply divide each coefficient by a quantization term and round to integers. The quantization terms are often unique for each coefficient, and are stored in a quantization matrix.

Wikipedia has a nice example. Here is how to implement that example in Matlab.

coef = [
 -415  -33  -58   35   58  -51  -15  -12;
    5  -34   49   18   27    1   -5    3;
  -46   14   80  -35  -50   19    7  -18;
  -53   21   34  -20    2   34   36   12;
    9   -2    9   -5  -32  -15   45   37;
   -8   15  -16    7   -8   11    4    7;
   19  -28   -2  -26   -2    7  -44  -21;
   18   25  -12  -44   35   48  -37  -3
   ];

quant = [
 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
    ];

quantCoef = round(coef ./ quant)

quantCoef =
   -26    -3    -6     2     2    -1     0     0
     0    -3     4     1     1     0     0     0
    -3     1     5    -1    -1     0     0     0
    -4     1     2    -1     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


clc
clear all
close all
image=imread('Water lilies.jpg');

Q=[8 36 36 36 39 45 52 65;
36 36 36 37 41 47 56 68;
36 36 38 42 47 54 64 78;
36 37 42 50 59 69 81 98;
39 41 47 54 73 89 108 130;
45 47 54 69 89 115 144 178;
53 56 64 81 108 144 190 243;
65 68 78 98 130 178 243 255];

GrayImage=rgb2gray(image);

NewImage=uint8(zeros(size(GrayImage)));
Q=uint32(Q);

for i=1:size(GrayImage,1)/8
    for j=1:size(GrayImage,2)/8

        block=GrayImage(((i-1)*8)+1:((i-1)*8)+8,((j-1)*8)+1:((j-1)*8)+8);
        dct=dct2(block);
        dct=uint32(dct);
        a=dct./Q;

        z=a.*Q;
        idct=idct2(z);
        NewImage(((i-1)*8)+1:((i-1)*8)+8,((j-1)*8)+1:((j-1)*8)+8)=uint8(idct);
    end
end
imwrite(NewImage,'NewImage.jpg');

GrayImage=double(GrayImage);
NewImage=double(NewImage);

MSE=0;
for i=1:size(GrayImage,1)
    for j=1:size(GrayImage,2)
        d=(GrayImage(i,j)-NewImage(i,j))^2;
        MSE=d+MSE;
    end
end
0

精彩评论

暂无评论...
验证码 换一张
取 消