我的教授。给了我两个用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
答案 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]);
}