首页 > 解决方案 > 2-DCT图像压缩matlab

问题描述

问题:

我尝试使用 matlab 实现离散余弦变换压缩。输入图像将是大小为 512 X 512 的 jpg 图像 (Lena)。

有两个阶段,即压缩和解压缩。

压缩和量化:

输入图像被转换为​​ YCbCr 分量。然后采用 Y 分量进行压缩。进一步的 DCT 将被量化。

量化和解压缩:

对量化后的图像进行去量化以进行解压缩。

问题:

在图像的解压缩版本中发现了矩形框。代码有什么问题吗?为了您的推断,下面是示例输入和输出图像,然后是 matlab 代码。

输入图像:

在此处输入图像描述

YCbCr 中的 Y 分量:

在此处输入图像描述

输出图像:

在此处输入图像描述

代码:

clc;
clear all;
close all;
I = imread('lena512.jpg');
figure, imshow(I);
% Y = I;
YCbCr = rgb2ycbcr(I);
figure, imshow(YCbCr);
Y = YCbCr(:,:, 1);
figure, imshow(Y);
[h, w] = size(Y);
r = h/8;
c = w/8;

s = 1;
q50 = [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];


%    COMPRESSION
for i=1:r
    e = 1;
    for j=1:c
        block = Y(s:s+7,e:e+7);
        cent = double(block) - 128;
        for m=1:8
            for n=1:8
                if m == 1
                    u = 1/sqrt(8);
                else
                    u = sqrt(2/8);
                end
                if n == 1
                    v = 1/sqrt(8);
                else
                    v = sqrt(2/8);
                end
                comp = 0;
                for x=1:8
                    for y=1:8
                        comp = comp + cent(x, y)*(cos((((2*(x-1))+1)*(m-1)*pi)/16))*(cos((((2*(y-1))+1)*(n-1)*pi)/16));
                    end
                end

                F(m, n) = v*u*comp;
            end
        end

        for x=1:8
            for y=1:8
                cq(x, y) = round(F(x, y)/q50(x, y));
            end
        end
        Q(s:s+7,e:e+7) = cq;
        e = e + 8;
    end
    s = s + 8;
end


% % % % % % % % % % % % % % %     
% % DECOMPRESSION
% % % % % % % 
s = 1;
for i=1:r
    e = 1;
    for j=1:c
        cq = Q(s:s+7,e:e+7);
        for x=1:8
            for y=1:8
                DQ(x, y) = q50(x, y)*cq(x, y); 
            end
        end
         for m=1:8
            for n=1:8
                if m == 1
                    u = 1/sqrt(8);
                else
                    u = sqrt(2/8);
                end
                if n == 1
                    v = 1/sqrt(8);
                else
                    v = sqrt(2/8);
                end
                comp = 0;
                for x=1:8
                    for y=1:8
                        comp = comp + u*v*DQ(x, y)*(cos((((2*(x-1))+1)*(m-1)*pi)/16))*(cos((((2*(y-1))+1)*(n-1)*pi)/16));
                    end
                end

                bf(m, n) = round(comp)+128;
            end

         end

         Org(s:s+7,e:e+7) = bf;
         e = e + 8;
    end
    s = s + 8;
end


imwrite(Y, 'F:\workouts\phd\jpeg\input.jpg');
imwrite(uint8(Org), 'F:\workouts\phd\jpeg\output.jpg');
return;

你能告诉我错误在哪里吗?这会很有帮助。

标签: matlabimage-compressiondct

解决方案


推荐阅读