使用DCT的Jpeg编码器

问题描述

我正在尝试使用C ++中的DCT压缩jpeg图像。图像像素保存在CImg中。 首先,我将图像切成8x8像素的块。 然后我将DCT应用于所有块。 最后,我使用矩阵Q进行量化处理。 下面的代码显示了我上面提到的所有步骤。

CImg<float> comp(image.width(),image.height(),1,0);
comp = image;


float sum;
vector< vector<float> >bloc(8,vector<float>(8));

// Quantization matrix
CImg<> Q(8,8);
Q(0,0)=16;   Q(0,1)=11;   Q(0,2)=10;   Q(0,3)=16;   Q(0,4)=24;   Q(0,5)=40;   Q(0,6)=51;   Q(0,7)=61;
Q(1,0)=12;   Q(1,1)=12;   Q(1,2)=14;   Q(1,3)=19;   Q(1,4)=26;   Q(1,5)=58;   Q(1,6)=60;   Q(1,7)=55;
Q(2,0)=14;   Q(2,1)=13;   Q(2,2)=16;   Q(2,3)=24;   Q(2,4)=40;   Q(2,5)=57;   Q(2,6)=69;   Q(2,7)=56;
Q(3,0)=14;   Q(3,1)=17;   Q(3,2)=22;   Q(3,3)=29;   Q(3,4)=51;   Q(3,5)=87;   Q(3,6)=80;   Q(3,7)=62;
Q(4,0)=18;   Q(4,1)=22;   Q(4,2)=37;   Q(4,3)=56;   Q(4,4)=68;   Q(4,5)=109;  Q(4,6)=103;  Q(4,7)=77;
Q(5,0)=24;   Q(5,1)=35;   Q(5,2)=55;   Q(5,3)=64;   Q(5,4)=81;   Q(5,5)=104;  Q(5,6)=113;  Q(5,7)=92;
Q(6,0)=49;   Q(6,1)=64;   Q(6,2)=78;   Q(6,3)=87;   Q(6,4)=103;  Q(6,5)=121;  Q(6,6)=120;  Q(6,7)=101;
Q(7,0)=72;   Q(7,1)=92;   Q(7,2)=95;   Q(7,3)=98;   Q(7,4)=112;  Q(7,5)=100;  Q(7,6)=103;  Q(7,7)=99;
Q *= quality; 

for (int u = 0; u < comp.width(); u += 8)
{
    for (int k = 0; k < comp.height(); k += 8)
    {
        CImg<float> a = comp.get_crop(u,k,u + 7,k + 7);  
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 8; j++) {   
                if(i == 0 && j == 0)
                    bloc[i][j] = 0.125;
                else if(i > 0 && j > 0)
                    bloc[i][j] = 0.176776695296636881;
                else if((i > 0 && j == 0) || (i == 0 && j > 0))
                    bloc[i][j] = 0.25;
                sum = 0;
                for(int x = 0; x < 8; x++) {
                    for(int y = 0; y < 8; y++) {
                        sum = sum + a(x,y) * (cos (((2 * x + 1) * i * PI) / 16)) * (cos(((2 * y + 1) * j * PI) / 16));
                    }
                }
                comp.get_crop(u,k + 7) = (ROUND((bloc[i][j] * sum) / Q(i,j)));
            }
        }
    }
}

问题是当我打开生成的压缩图像时,它看起来与真实图像完全相同。 我正在上传未压缩和已压缩的图像,因此您可以更好地理解。

Uncompressed image

Compressed image

能否请您帮助我了解问题所在,或者我的代码是否正确以及压缩后的图像是否正确? 谢谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...