我的教授。给了我两个用C写的程序:无损压缩和解压缩。为了提高压缩比,我必须实现整数小波变换(我使用了Haar函数的提升方案,但后来改为Daubecaries5/3 int-int)。
所有修改后的程序都进行得很好,除了一个错误,这个错误也存在于他分发的原始程序中。
在几种医学类型的*.bmp扩展图像中,有两幅图像无法恢复到它们最初的形式(即只看到一些黑白块而没有看到人脸),尽管检查功能表明压缩过程前后文件之间没有区别。
请记住,解压缩后的其他图像看起来与原始映像相同。
您可以在这里查看这些图像:http://s844.photobucket.com/home/miroseh。月球表面和塞尔达(女孩)是不好的。X光胸片很完美。
我希望听到你的解决方案。我已经坚持了好几个星期了。
我将create_matrix_image (在compress.cpp中)和restorebmp函数(在decompress.cpp中)附加如下。
如果这些仍然不明确,可以下载源代码和灰色图像 这里。
使用Borland /C++ 5.02编译器更好:http://www.mediafire.com/?njmm1ovenmm
谢谢你的考虑。
发布于 2010-08-10 13:27:22
您所说的“检查函数通知压缩过程前后文件之间没有区别”是什么意思?我猜你是在比较这两幅图像的原始数据。如果原始图像数据是相同的,但文件最终是不同的,这可能与不正确的BMP头有关。尝试比较BMP文件以及。我看到,塞尔达的图像仅在前1088字节上不同,而胸部图像仅在前64个字节上有所不同。
在这里查看BMP文件规范,您可能会发现一些有关头文件的信息:
标题
发布于 2010-08-11 08:38:30
检查函数将初始图像的灰度矩阵与相应的解压缩矩阵进行比较。它没有什么区别,但不知怎么的,有些图像被很好地解压,而有些则不是。
但我不认为头球出了差错。
他们都是符合标准的。
结构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函数:
无效restorebmp(int ) { 结构tagBITMAPFILEHEADER bmfh; 结构tagBITMAPINFOHEADER bmih; 结构tagRGBQUAD rgb256; char outfile_nameMAXFILE+MAXEXT; char ext10; int i,j; char gray_bit; 档案*恢复; I=0;ifor(j=0;j{ int temp=0; int bit8; (bit_no = 7;bit_no >= 0;bit_no-) { bitbit_no=*((char _)bit_planebit_no+i_wid+j); if(way!=0 && bit_no<7) bitbit_no = bitbit_no^bitbit_no + 1; //将它们转换为要保存到picti的十进制值 temp+=bitbit_no*pow(2,bit_no); } picti=temp; } //变化灰度值 (i=0;ifor(j=0;jpicti=p1[picti]); 未签名的字符温度; (i = 0;i< hei/2;i++) (j = 0;j< wid;j++) { temp = picti; picti = picthei-i-1; } //创建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 tempc256; int count=0; (i=0;i<32;i++) (j=0;j<8;j++) {tempc8*i+j=bit(j,强度); if (tempc8*i+j==1) {rgbcount.bBlue=(无符号字符)(8*i+j); Rgbcount.bGreen=(无符号炭)(8*i+j);rgbcount.bRed=(无符号炭)(8*i+j);rgbcount.bReserved=0; count++; } } if(count<256) (i=count;i<256;i++) { rgbi.bBlue=0; rgbi.bGreen=0;rgbi.bRed=0;rgbi.bReserved=0; } //创建bmp文件 strcpy(outfile_name,orig_name); 短跑(ext,"%d_gn.bmp",way); strcat(outfile_name,ext); 如果( (restore = fopen (outfile_name,"wb")) == NULL ) { printf (“无法创建bmp文件”);getch();退出(1);} fwrite (&bmfh,sizeof(struct tagBITMAPFILEHEADER),1,restore); fwrite (&bmih,sizeof(struct tagBITMAPINFOHEADER),1,restore); (i=0;i<256;i++) fwrite (&rgbi,sizeof(struct tagRGBQUAD),1,还原); (恢复,0x0436,SEEK_SET); for(i=0;ifor(j=0;jfwrite(&picti,sizeof(picti),1,restore)); 关闭(恢复); cprintf(“完成还原bmp文件\n\r”); (i=0;i<8;i++) 游离(Bit_planei); (i=0;i<7;i++) 游离(Refer_planei); }
https://stackoverflow.com/questions/3449192
复制相似问题