Сжатие изображений без потерь - Ошибка восстановления изображения - PullRequest
0 голосов
/ 10 августа 2010

Мой проф. дал мне две программы, написанные на C: сжатие без потерь и декомпрессионное. Мне нужно реализовать целочисленное вейвлет-преобразование (я использовал схему поднятия функции Хаара, но позже я перешел на Daubechies 5/3 int-to-int) в кодовые блоки для улучшения степени сжатия.

В модифицированных программах все шло нормально, кроме одной ошибки, которая также существует в оригинальных программах, которые он раздавал.

Среди нескольких изображений медицинского типа с расширением * .bmp есть два изображения, которые не могут быть восстановлены до их первоначальных форм (то есть просто видя несколько блоков черного и белого вместо того, чтобы видеть человеческое лицо) хотя функция проверки сообщает, что нет разницы между файлами до и после процесса сжатия.

Помните, что остальные изображения после распаковки выглядят идентичными оригинальным.

Вы можете посмотреть эти изображения здесь: http://s844.photobucket.com/home/miroseh. Поверхность Луны и Зельда (девушка) не хороши. Рентген грудной клетки идеально.

Я надеюсь услышать от вас решения. Я придерживался этого в течение нескольких недель.

Я присоединяю функции create_matrix_image (в compress.cpp) и restorebmp (в degpress.cpp) следующим образом.

Если они все еще неоднозначны, вы можете загрузить исходные коды и серые изображения здесь

Лучше использовать компилятор Borland C / C ++ 5.02: http://www.mediafire.com/?njmm1ovenmm

Спасибо за внимание.

Ответы [ 2 ]

0 голосов
/ 11 августа 2010

Функция проверки сравнивает матрицу градаций серого исходного изображения с соответствующей распакованной. Он не показывает различий, но некоторые изображения хорошо распакованы, а некоторые нет.

Но я не думаю, что в заголовке произошла ошибка.

Они все соответствуют стандартным значениям.

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; J

{int temp = 0;

int bit [8];

для (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) </p>

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

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

Температура + = бит [bit_no] * пау (2, bit_no);

}

пикт [I] [J] = темп; * +1069 *

}

// изменить значение серого

для (I = 0; я * * Для тысячи семьдесят пять (J = 0; J

пикт [I] [J] = р1 [пикт [I] [J]]; * 1 077 *

unsigned char temp;

для (i = 0; i

для (j = 0; 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;

для (я = 0; г <32; я ++) </p>

для (J = 0; J <8; j ++) </p> * * +1137 {tempc [8 * I + J] = бит (J, интенсивность [I]);

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

{rgb [count] .bBlue = (знак без знака) (8 * i + j);

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

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

 rgb[count].bReserved=0;

кол ++;

}

}

, если (количество <256) </p>

для (I = Count; г <256; я ++) </p>

{rgb [i] .bBlue = 0;

 rgb[i].bGreen=0;

  rgb[i].bRed=0;

 rgb[i].bReserved=0;

}

// Создать файл bmp

* +1161 * зЬгсру (outfile_name, orig_name); * * тысячу сто шестьдесят два * +1163 * Sprintf (доб, "% d_gn.bmp", путь); * +1164 * * +1165 * strcat (outfile_name, доб);

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, восстановление);

для (i = 0; i <256; i ++) </p>

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

FSEEK (восстановление, 0x0436, SEEK_SET);

для (I = 0; я * * 1 181 для (J = 0; J

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

fclose (восстановление);

cprintf ("Завершить восстановление bmp файла \ n \ r");

для (i = 0; i <8; i ++) </p>

free (bit_plane [i]);

для (i = 0; i <7; i ++) </p>

бесплатно (refer_plane [i]);

}

0 голосов
/ 10 августа 2010

Что вы подразумеваете под "функция проверки сообщает, что нет разницы между файлами до и после процесса сжатия" ? Я полагаю, вы сравниваете необработанные данные между двумя изображениями. Если исходные данные изображения идентичны, но файлы в конечном итоге отличаются, это может быть связано с неправильным заголовком BMP. Попробуйте также сравнить файлы BMP. Я вижу, что изображения Zelda отличаются только на первых 1088 байтах, тогда как изображения сундуков отличаются только на первых 64 байтах.

Взгляните на спецификацию файла BMP здесь, вы можете найти некоторую информацию о заголовке:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...