如何解决使用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)));
}
}
}
}
问题是当我打开生成的压缩图像时,它看起来与真实图像完全相同。 我正在上传未压缩和已压缩的图像,因此您可以更好地理解。
能否请您帮助我了解问题所在,或者我的代码是否正确以及压缩后的图像是否正确? 谢谢!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。