II.5.3.Một số thủ tục ch-ơng trình

Một phần của tài liệu Đề án tốt nghiệp: Tìm hiểu một số phương pháp nén ảnh ppt (Trang 48 - 56)

Ch-ơng II: Các ph-ơng pháp nén ảnh

II.5.3.Một số thủ tục ch-ơng trình

Mỗi khối Zig-Zag này đ-ợc mã hoá theo ph-ơng pháp RLE. Cuối mỗi khối đầu ra của RLE, ta đặt dấu kết thúc khối EOB (End Of Block). Sau đó các khối đ-ợc dồn lại và lại mã hoá một lần bằng ph-ơng pháp mã Huffman. Nhờ có dấu kết thúc khối nên có thể phân biệt hai khối cạnh nhau khi giải mã Huffman. Hai bảng mã Huffman cho hai thành phần hệ số tất nhiên sẽ khác nhau.

Để có thể giải nén đ-ợc, chúng ta phải ghi lại các thông tin nh-: kích th-ớc ảnh, kích th-ớc khối, ma trận T, độ lệch tiêu chuẩn, các mức tạo lại, hai bảng mã Huffman, kích th-ớc khối nén một chiều, kích th-ớc khối nén xoay chiều … và ghi nối tiếp vào hai tệp nén của hai thành phần hệ số.

Cài đặt giải thuật cho nén JPEG thực sự phức tạp. chúng ta phải lắm đ-ợc các kiến thức về nén RLE, Huffman, biến đổi Cosin, xây dựng bộ l-ợng tử hoá Lloyd ” Max … Tuy nén và giải nén JPEG hơi chậm nh-ng bù lại cho kích th-ớc tệp nén nhỏ.

II.5.3.Một số thủ tục ch-ơng trình :

Ch-ơng trình nén ph-ơng pháp JPEG:

bool CJPEG::write_JPEG_file(const char * filename, int quality) // JPEG compression

{

struct jpeg_compress_struct cinfo; struct jpeg_error_mgr jerr;

FILE * outfile;

unsigned char ** buffer; int row_stride;

outfile = fopen(filename, "wb"); if (outfile == NULL) return false;

cinfo.err = jpeg_std_error(&jerr); jpeg_create_compress(&cinfo); jpeg_stdio_dest(&cinfo, outfile); cinfo.image_width = m_width; cinfo.image_height = m_height; cinfo.input_components = m_mode; switch (m_mode) { case MODE_RGB: cinfo.in_color_space = JCS_RGB; break; case MODE_GRAYSCALE: cinfo.in_color_space = JCS_GRAYSCALE; break; } jpeg_set_defaults(&cinfo);

jpeg_set_quality(&cinfo, quality, TRUE); jpeg_start_compress(&cinfo, TRUE);

row_stride = m_width * cinfo.input_components; buffer = new unsigned char * [cinfo.image_height];

buffer[0] = new unsigned char[cinfo.image_height * row_stride]; for (int k = 0; k < (int)(cinfo.image_height); k++) {

buffer[k] = buffer[0] + row_stride*k; } int i, j; switch (m_mode) { case MODE_RGB: for (j = 0; j < m_height; j++)

for (i = 0; i < m_width*3; i += 3) { buffer[j][i] = image[j][i/3].red; buffer[j][i+1] = image[j][i/3].green; buffer[j][i+2] = image[j][i/3].blue; } } break; case MODE_GRAYSCALE: for (j = 0; j < m_height; j++) {

for (i = 0; i < m_width; i++) { buffer[j][i] = gImage[j][i]; } } break; }

while (cinfo.next_scanline < cinfo.image_height) {

(void) jpeg_write_scanlines(&cinfo, &buffer[cinfo.next_scanline], 1); } jpeg_finish_compress(&cinfo); fclose(outfile); delete [] buffer[0]; delete [] buffer; jpeg_destroy_compress(&cinfo); return true; }

Ch-ơng trình giải nén ph-ơng pháp JPEG:

int CJPEG::write_BMP_file(const char * outfile) // Writes a bitmap (.bmp) file (JPEG decompression) {

FILE * fp; size_t result;

int rowEndBytes = (4-(m_width*3)%4)%4; BITMAPFILEHEADER bmFileHdr;

bmFileHdr.bfType = 0x4d42;

bmFileHdr.bfSize = 58 + (m_width*3 + rowEndBytes) * m_height; bmFileHdr.bfReserved1 = 0; bmFileHdr.bfReserved2 = 0; bmFileHdr.bfOffBits = 58; BITMAPINFOHEADER bmInfo; bmInfo.biSize = 40; bmInfo.biWidth = m_width; bmInfo.biHeight = m_height; bmInfo.biPlanes = 1; bmInfo.biBitCount = 24; bmInfo.biCompression = BI_RGB;

bmInfo.biSizeImage = (m_width*3 + rowEndBytes) * m_height; bmInfo.biXPelsPerMeter = 0;

bmInfo.biYPelsPerMeter = 0; bmInfo.biClrUsed = 0; bmInfo.biClrImportant = 0; fp = fopen(outfile, "wb");

if (fp == NULL) return WRITE_BMP_FILENOTFOUND_ERR;

result = fwrite((char *)&bmFileHdr, sizeof(BITMAPFILEHEADER), 1, fp); if (result == 0)

fclose(fp); (adsbygoogle = window.adsbygoogle || []).push({});

return WRITE_BMP_WRITE_ERR; }

result = fwrite((char *)&bmInfo, sizeof(BITMAPINFO), 1, fp); if (result == 0) { fclose(fp); return WRITE_BMP_WRITE_ERR; } RGBpixel pixel; BYTE pJunk = 0;

for (int j = m_height - 1; j >= 0; j--) {

for (int i = 0; i < m_width; i++) {

this->getPixel(j, i, pixel);

result = fwrite((BYTE *)&pixel.blue, sizeof(BYTE), 1, fp); if (result == 0)

{

fclose(fp);

return WRITE_BMP_WRITE_ERR; }

result = fwrite((BYTE *)&pixel.green, sizeof(BYTE), 1, fp); if (result == 0)

{

fclose(fp);

return WRITE_BMP_WRITE_ERR; }

{ fclose(fp); return WRITE_BMP_WRITE_ERR; } } if (rowEndBytes != 0)

result = fwrite((BYTE *)&pJunk, sizeof(BYTE), rowEndBytes, fp); if (result == 0) { fclose(fp); return WRITE_BMP_WRITE_ERR; } } fclose(fp); return WRITE_BMP_SUCCESS; }

II.6.Ph-ơng pháp mã hoá JPEG2000:

II.6.1. Lịch sử ra đời và phỏt triển chuẩn JPEG2000:

Như chỳng ta đó biết, sự ra đời của JPEG mang lại nhiều lợi ớch to lớn về nhiều mặt. JPEG cú thể giảm nhỏ kớch thước ảnh, giảm thời gian truyền và làm giảm chi phớ xử lý ảnh trong khi chất lượng ảnh là khỏ tốt. Tuy nhiờn cho đến nay người ta mới chỉ ứng dụng dạng thức nộn cú tổn thất thụng tin của JPEG vỡ mó hoỏ khụng tổn thất của JPEG là khỏ phức tạp. Để việc nộn ảnh cú hiệu quả hơn, Ủy ban JPEG đó đưa ra một chuẩn nộn ảnh mới là

JPEG2000. JPEG2000 sử dụng biến đổi Wavelet và cỏc phương phỏp mó hoỏ đặc biệt để cú được ảnh nộn ưu việt hơn hẳn JPEG. JPEG2000 hiện vẫn đang tiếp tục được phỏt triển, nhưng phần I đó được tổ chức ISO chấp nhận

là chuẩn nộn ảnh quốc tế ỏp dụng cho ảnh tĩnh. Chuẩn nộn ảnh JPEG2000

mà xương sống là biến đổi Wavelet với tớnh năng vượt trội so với JPEG

chắc chắn sẽ được sử dụng trong cỏc server nội dung để chuyển đổi định dạng ảnh trong mạng di động.

II.6.2.Cỏc tớnh năng của JPEG2000:

JPEG2000 cú nhiều chức năng đặc biệt hơn mọi chuẩn nộn ảnh tĩnh khỏc như JPEG hay GIF. Dưới đõy là cỏc chức năng ưu việt của JPEG2000

so với cỏc chuẩn nộn ảnh tĩnh khỏc

- Cho chất lượng ảnh tốt nhất khi ỏp dụng nộn ảnh tĩnh cú tổn thất. - Sử dụng được với truyền dẫn và hiển thị luỹ tiến về chất lượng, độ phõn giải, cỏc thành phần màu và cú tớnh định vị khụng gian.

- Sử dụng cựng một cơ chế nộn ảnh cho cả hai dạng thức nộn. - Truy nhập và giải nộn tại mọi thời điểm trong khi nhận dữ liệu.

- Giải nộn từng vựng trong ảnh mà khụng cần giải nộn toàn bộ ảnh. - Cú khả năng mó hoỏ ảnh với tỷ lệ nộn theo từng vựng khỏc nhau. - Nộn một lần nhưng cú thể giải nộn với nhiều cấp chất lượng tuỳ theo yờu cầu của người sử dụng.

Hiện tại, ISO và uỷ ban JPEG đó đưa ra khuyến nghị thay thế JPEG

bằng JPEG2000. (adsbygoogle = window.adsbygoogle || []).push({});

II.6.3.Cỏc bước thực hiện nộn ảnh theo chuẩn JPEG2000:

Hình 2.6.1:Các b-ớc nén và giải nén JPEG2000

Một phần của tài liệu Đề án tốt nghiệp: Tìm hiểu một số phương pháp nén ảnh ppt (Trang 48 - 56)