无损图像压缩 - 图像恢复故障

时间:2010-08-10 13:04:20

标签: image-compression lossless

我的教授。给了我两个用C语言编写的程序:无损压缩和减压压缩。我必须实现整数小波变换(我正在使用Haar函数的提升方案,但我之后改为Daubechies 5/3 int-to-int)到代码块以提高压缩比。

修改后的节目一切都很顺利,除了他发放的原始节目中也存在一个错误。

在* .bmp扩展的几个医学类型图像中,有两个图像无法恢复到其初始形式(即只看到一些黑白块而不是看到人脸)虽然检查功能通知压缩过程之前和之后的文件没有区别。

请记住,解压缩后的其余图像看起来与原始图像完全相同。

您可以在此处查看这些图片:http://s844.photobucket.com/home/miroseh。月亮表面和塞尔达(女孩)并不好。 X光胸部非常完美。

我希望听到你的解决方案。我已经坚持了几个星期。

我将create_matrix_image(在compress.cpp中)和restorebmp函数(在decompress.cpp中)附加如下。

如果这些仍然含糊不清,您可以下载源代码和灰色图片here

使用Borland C / C ++ 5.02编译器最好:http://www.mediafire.com/?njmm1ovenmm

感谢您的考虑。

2 个答案:

答案 0 :(得分:0)

“检查功能通知压缩过程前后文件之间没有差异”是什么意思?我猜你是在比较两张图片之间的原始数据。如果原始图像数据相同但文件最终不同,则可能与错误的BMP标头有关。尝试比较BMP文件。我看到塞尔达图像只在前1088个字节上有所不同,而胸部图像仅在前64个字节上有所不同。

在这里查看BMP文件规范,您可以找到有关标题的一些信息:

http://en.wikipedia.org/wiki/BMP_file_format#BMP_File_Header

答案 1 :(得分:0)

检查功能将初始图像的灰度矩阵与其相关的解压缩矩阵进行比较。它显示没有差异,但不知何故,一些图像被很好地解压缩,而有些则没有。

但我不认为HEADER发生了错误。

他们都遵守标准。

  

struct tagBITMAPFILEHEADER bmfh;

     

//创建BITMAPFILEHEADER

     

bmfh.wType = 0x4d42;

     

bmfh.dwSize = wid * hei + 1078;

     

bmfh.wReserved1 = 0;

     

bmfh.wReserved2 = 0;

     

bmfh.dwOffBits = 0x0436;

“尝试比较BMP文件”和“Zelda图像仅在前1088个字节上有所不同,而胸部图像仅在前64个字节上有所不同”是什么意思?

这是整个restorebmp函数:

  

void restorebmp(int way)

     

{

     

struct tagBITMAPFILEHEADER bmfh;

     

struct tagBITMAPINFOHEADER bmih;

     

struct tagRGBQUAD rgb [256];

     

char outfile_name [MAXFILE + MAXEXT];

     

char ext [10];

     

int i,j;

     

char gray_bit;

     

文件*恢复;

     

为(I = 0;我      

对于(j = 0;Ĵ      

{int temp = 0;

     

int bit [8];

     

for(bit_no = 7; bit_no> = 0; bit_no - )

     

{bit [bit_no] = *((char )bit_plane [bit_no] + i wid + j);

     

if(way!= 0&& bit_no< 7)

     

bit [bit_no] = bit [bit_no] ^ bit [bit_no + 1];

// convert them to decimal values to be saved to pict[i][j]
     

温度+ =比特[bit_no] * POW(2,bit_no);

     

}

     

PICT [i] [j] =温度;

     

}

     

//更改灰色值

     

为(I = 0;我      

对于(j = 0;Ĵ      

PICT [i] [j] = P1 [PICT [i] [j]];

     

unsigned char temp;

     

for(i = 0; i< hei / 2; i ++)

     

for(j = 0; j< wid; j ++)

     

{

     

temp = pict [i] [j];

 pict[i][j]  = pict[hei-i-1][j];

 pict[hei-i-1][j] = temp;
     

}

     

//创建BITMAPFILEHEADER

     

bmfh.wType = 0x4d42;

     

bmfh.dwSize = wid * hei + 1078;

     

bmfh.wReserved1 = 0;

     

bmfh.wReserved2 = 0;

     

bmfh.dwOffBits = 0x0436;

     

//创建BITMAPINFOHEADER

     

bmih.dwSize = 40;

     

bmih.dwWidth = wid;

     

bmih.dwHeight = hei;

     

bmih.wPlanes = 1;

     

bmih.wBitCount = 8;

     

bmih.dwCompression = 0;

     

bmih.dwSizeImage = hei * wid;

     

bmih.dwXPelsPerMeter = 0;

     

bmih.dwYPelsPerMeter = 0;

     

bmih.dwClrUsed = 0;

     

bmih.dwClrImportant = 0;

     

//创建调色板

     

char tempc [256];

     

int count = 0;

     

为(I = 0; I< 32;我++)

     

对于(j = 0; J< 8; J ++)

     

{tempc [8 * I + J] =位(j,强度[I]);

     

if(tempc [8 * i + j] == 1)

     

{rgb [count] .bBlue =(unsigned char)(8 * i + j);

 rgb[count].bGreen=(unsigned char)(8*i+j);

 rgb[count].bRed=(unsigned char)(8*i+j);

 rgb[count].bReserved=0;
     

计数++;

     

}

     

}

     

如果(计数N 256)

     

有(ⅰ=计数; I< 256;我++)

     

{rgb [i] .bBlue = 0;

 rgb[i].bGreen=0;

  rgb[i].bRed=0;

 rgb[i].bReserved=0;
     

}

     

//创建bmp文件

     

的strcpy(outfile_name,orig_name);

     

的sprintf(分机, “%d_gn.bmp”,方式);

     

strcat的(outfile_name,电话分机);

     

if((restore = fopen(outfile_name,“wb”))== NULL)

  { printf ("Cannot create bmp file");

   getch();

   exit (1);

  }
     

fwrite(& bmfh,sizeof(struct tagBITMAPFILEHEADER),1,restore);

     

fwrite(& bmih,sizeof(struct tagBITMAPINFOHEADER),1,restore);

     

表示(i = 0; i <256; i ++)

     

fwrite(&amp; rgb [i],sizeof(struct tagRGBQUAD),1,restore);

     

FSEEK(还原,0x0436,SEEK_SET);

     

为(I = 0;我      

对于(j = 0;Ĵ

fwrite(&pict[i][j],sizeof(pict[i][j]),1,restore);
     

FCLOSE(恢复);

     

cprintf(“完成恢复bmp文件\ n \ r”);

     

为(I = 0; I&LT; 8;我++)

     

自由(bit_plane [I]);

     

为(I = 0; I&LT; 7;我++)

     

自由(refer_plane [I]);

     

}