0

我的教授。给了我两个用 C 编写的程序:无损压缩和解压缩。我必须对代码块执行整数小波变换(我使用的是 Haar 函数的提升方案,但后来我改为使用 Daubechies 5/3 int-to-int)以提高压缩率。

修改后的程序一切正常,除了他分发的原始程序中也存在一个错误。

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

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

您可以在这里查看这些图片:http: //s844.photobucket.com/home/miroseh。月球表面和塞尔达(女孩)不好。X 光胸部是完美的。

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

我附加了 create_matrix_image(在 compress.cpp 中)和 restorebmp 函数(在 decompress.cpp 中),如下所示。

如果这些还是有歧义的,你可以在这里下载源代码和灰图

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

谢谢您的考虑。

4

2 回答 2

0

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

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

它们都符合标准值。

结构标签BITMAPFILEHEADER 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方式)

{

结构标签BITMAPFILEHEADER bmfh;

结构标签BITMAPINFOHEADER bmih;

结构标签RGBQUAD RGB [256];

char outfile_name[MAXFILE+MAXEXT];

字符分机[10];

整数 i, j;

char gray_bit;

文件*恢复;

对于(我=0;我

对于(j=0;j

{ int temp=0;

整数位[8];

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

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

如果(方式!= 0 && bit_no<7)

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

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

temp+=bit[bit_no]*pow(2,bit_no);

}

pict[i][j]=温度;

}

// 改变灰度值

对于(我=0;我

对于(j=0;j

pict[i][j]=p1[pict[i][j]];

无符号字符温度;

对于 (i = 0; i < hei/2; i++)

对于 (j = 0; j < wid; j++)

{

温度 = 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 = 宽度;

bmih.dwHeight = hei;

bmih.wPlanes = 1;

bmih.wBitCount = 8;

bmih.dw压缩 = 0;

bmih.dwSizeImage = hei*wid;

bmih.dwXPelsPerMeter = 0;

bmih.dwYPelsPerMeter = 0;

bmih.dwClrUsed = 0;

bmih.dwClrImportant = 0;

// 创建调色板

字符温度 [256];

整数计数=0;

对于(i=0;i<32;i++)

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

{tempc[8*i+j]=bit(j,intensity[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;

计数++;

}

}

如果(计数<256)

for(i=count;i<256;i++)

{ rgb[i].bBlue=0;

 rgb[i].bGreen=0;

  rgb[i].bRed=0;

 rgb[i].bReserved=0;

}

//创建bmp文件

strcpy(outfile_name,orig_name);

sprintf(ext,"%d_gn.bmp",way);

strcat(outfile_name,ext);

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 (&rgb[i], sizeof(struct tagRGBQUAD), 1, restore);

fseek(恢复,0x0436,SEEK_SET);

对于(我=0;我

对于(j=0;j

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

fclose(恢复);

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

对于(i=0;i<8;i++)

免费(位平面[i]);

对于(i=0;i<7;i++)

免费(参考平面[i]);

}

于 2010-08-11T08:38:30.190 回答
0

“检查功能通知压缩过程之前和之后的文件之间没有区别”是什么意思?我猜您正在比较两个图像之间的原始数据。如果原始图像数据相同但文件最终不同,这可能与不正确的 BMP 标头有关。尝试比较 BMP 文件。我看到 Zelda 图像仅在前 1088 个字节上有所不同,而胸部图像仅在前 64 个字节上有所不同。

在此处查看 BMP 文件规范,您可能会找到有关标头的一些信息:

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

于 2010-08-10T13:27:22.720 回答