0

私の教授。は、C で書かれた 2 つのプログラムをくれました。ロスレス圧縮と解凍プログラムです。整数ウェーブレット変換 (Haar 関数のリフティング スキームを使用していましたが、後で Daubechies 5/3 int-to-int に変更しました) をコード ブロックに実装して、圧縮率を改善する必要があります。

彼が配布した元のプログラムにも存在する1つの間違いを除いて、変更されたプログラムではすべてがうまくいきました.

拡張子が *.bmp のいくつかの医療用画像の中で、関数をチェックすると違いはないと通知されますが、元の形に復元できない画像が 2 つあります(つまり、人間の顔ではなく、白黒のブロックがいくつか見えるだけです)。圧縮プロセスの前後のファイル間。

解凍後の残りの画像は、元の画像と同じに見えることに注意してください。

これらの画像はhttp://s844.photobucket.com/home/mirosehでご覧いただけます。月面とゼルダ(少女)は苦手。胸部レントゲンはバッチリ。

皆様からの解決策をお待ちしております。私は何週間もこれに固執しました。

次のように、create_matrix_image (compress.cpp 内) と restorebmp 関数 (decompress.cpp 内) を添付します。

これらがまだ曖昧な場合は、ソース コードと灰色のイメージをここからダウンロードできます。

Borland C/C++ 5.02 コンパイラを使用することをお勧めします: http://www.mediafire.com/?njmm1ovenmm

ご検討をお願いいたします。

4

2 に答える 2

0

「チェック機能は、圧縮プロセスの前後でファイルに違いがないことを通知する」とはどういう意味ですか?2つの画像間で生データを比較していると思います。生の画像データが同一で​​あるがファイルが異なる結果になる場合、これは誤ったBMPヘッダーに関係している可能性があります。BMPファイルも比較してみてください。ゼルダの画像は最初の1088バイトでのみ異なるのに対し、胸の画像は最初の64バイトでのみ異なることがわかります。

ここでBMPファイルの仕様を見てください。ヘッダーに関する情報が見つかる場合があります。

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

于 2010-08-10T13:27:22.720 に答える
0

チェック関数は、初期イメージのグレースケール マトリックスを、関連する解凍されたイメージと比較します。違いはありませんが、うまく解凍できる画像とそうでない画像があります。

でも、HEADERにミスはなかったと思います。

それらはすべて標準値に準拠しています。

struct tagBITMAPFILEHEADER bmfh;

// BITMAPFILEHEADER を作成します

bmfh.wType = 0x4d42;

bmfh.dwSize = wid*hei+1078;

bmfh.wReserved1 = 0;

bmfh.wReserved2 = 0;

bmfh.dwOffBits = 0x0436;

「BMP ファイルを比較してみる」と「ゼルダの画像は最初の 1088 バイトだけが異なるのに対し、胸部の画像は最初の 64 バイトだけが異なる」とはどういう意味ですか?

これは、restorebmp 関数全体です。

void restorebmp(int の方法)

{

struct tagBITMAPFILEHEADER bmfh;

struct tagBITMAPINFOHEADER bmih;

struct tagRGBQUAD rgb[256];

char outfile_name[MAXFILE+MAXEXT];

char ext[10];

int i、j;

char gray_bit;

FILE *復元;

for(i=0;i

for(j=0;j

{ int temp=0;

int ビット [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]

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

}

pict[i][j]=一時;

}

// グレー値を変更

for(i=0;i

for(j=0;j

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

符号なし文字温度;

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 カウント = 0;

for(i=0;i<32;i++)

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

{tempc[8*i+j]=bit(j,強度[i]);

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

{ rgb[カウント].bBlue=(符号なし文字)(8*i+j);

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

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

 rgb[count].bReserved=0;

カウント++;

}

}

if(count<256)

for(i=カウント;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, 復元);

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

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

fwrite (&rgb[i], sizeof(struct tagRGBQUAD), 1, 復元);

fseek (復元、0x0436、SEEK_SET);

for(i=0;i

for(j=0;j

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

fclose(復元);

cprintf("bmp ファイルの復元を完了\n\r");

for(i=0;i<8;i++)

無料 (bit_plane[i]);

for(i=0;i<7;i++)

無料 (refer_plane[i]);

}

于 2010-08-11T08:38:30.190 に答える