Tài liệu Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh - Pdf 91

Đồ án tốt nghiệp

Tìm hiểu một số phương pháp nén
ảnh

nén ảnh phổ biến như : mã loạt dài RLE, HUFFMAN, LZW, JPEG và
phương pháp nén ảnh JPEG2000 dựa trên biến đổi Wavelet với những đặc
tính vượt trội so với các chuẩn nén trước đó đem lại hiệu quả nén cao , cho
ảnh nén chất lượng t
ốt và nhiều những ưu điểm khác mà các chuẩn nén
trước đó không thể có.
Nội dung đồ án tốt nghiệp bao gồm các phần chính như : chương một
giới thiệu tổng quan về xử lý ảnh, mục đích chương này là giới thiệu một số
khái niệm cần biết về ảnh số và xử lý ảnh số. Chương hai sẽ giới thiệu một
số phương pháp nén
ảnh và cách phân loại các phương pháp nén ảnh.
Chương ba sẽ giới thiệu về chương trình thử nghiệm và kết quả đạt đựơc
Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh
Sinh viên thực hiện : Tạ Minh Thắng CT 702

Trang :
2

của chương trình. Cuối cùng sẽ là phần kết luận đánh giá kết quả nghiên cứu
thu được và hướng phát triển của đề tài. CHƯƠNG I:
GIỚI THIỆU TỔNG QUAN VỀ NÉN ẢNH

I.1.Giới thiệu về ảnh số và xử lý ảnh số: I.1.1.Ảnh số:
Ảnh có thể biểu diễn dưới dạng tín hiệu tương tự hoặc tín hiệu số. Trong
Hình 1.1 Biểu diễn của một mức xám của ảnh số. I.1.2.Xử lý ảnh số:

Xử lý ảnh là một khoa học mặc dù còn tương đối mới so với nhiều
ngành khoa học khác ,nhất là trên quy mô công nghiệp. Xử lý ảnh số có rất
nhiều ứng dụng như làm nổi các ảnh trong y học, khôi phục lại ảnh do tác
động của khí quyển trong thiên văn học, tăng cường độ phân giải của ảnh
truyền hình mà không cần thay đổi cấu trúc bên trong của hệ thống chuyển
tả
i, nén ảnh trong khi truyền đi xa hoặc lưu trữ.
Các giai đoạn chính trong xử lý ảnh có thể được mô tả trong hình sau: Độ sáng trung bình trong mỗi hình
chữ nhật = giá trị một điểm ảnh.

Pixel

I.2.Mục đích và sự cần thiết của “ nén ảnh ”: Nén ảnh là một kỹ thuật mã hoá các ảnh số hoá nhằm giảm số lượng
các bit dữ liệu cần thiết để biểu diễn ảnh. Mục đích là giảm đi những chi phí
trong việc lưu trữ ảnh và chi phí thời gian để truyền ảnh đi xa trong truyền
thông nhưng vẫn đảm bảo được chất lượng của ảnh. Nén ảnh thực hiện được
là do mộ
t thực tế: thông tin trong bức ảnh không phải là ngẫu nhiên mà có
trật tự , tổ chức.Vì thế nếu bóc tách được tính trật tự, cấu trúc đó thì sẽ biết
phần thông tin nào quan trọng nhất trong bức ảnh để biểu diễn và truyền đi
với số lượng ít bit hơn so với ảnh gốc mà vẫn đảm bảo tính đầy đủ của
thông tin.Ở bên nhận quá trình giải mã sẽ tổ chức, s
ắp xếp lại được bức ảnh
xấp xỉ gần chính xác so với ảnh gốc nhưng vẫn thỏa mãn chất lượng yêu
cầu. Dưới đây là ví dụ về lưu trữ ảnh số và truyền đi xa với đường truyền
9600 baud (9600 bps) để thấy rõ sự cần thiết của việc nén ảnh:

Ảnh đa cấp xám hay ảnh 256 màu có kích thước 800 x 600, 8 bit/điểm
ảnh, cần 3.840.000 bit lưu trữ và mất 6.67 phút để truyền.


Ảnh màu RGB (24 bit/điểm ảnh ) cùng độ phân giải như vậy cần hơn
10 triệu bit để lưu trữ và 20 phút để truyền.


Một phim âm bản có kích thước 24 × 36 mm (35 mm) chia bằng các
khoảng cách nhau 12 àm, vào khoảng 3000 × 2000 điểm, 8 bit / pixel, yêu
cầu 48 triệu bit cho lưu giữ ảnh và 83 phút để truyền.
Qua ví dụ trên ta thấy nhiều vấn đề trong việc lưu trữ và truyền tải ảnh

Ảnh trong thực tế là một ảnh liên tục về không gian và về giá trị độ
sáng. Để có thể xử lý ảnh bằng máy tính cần thiết phải tiến hành số hoá ảnh.
Như vậy một ảnh là một tập hợp các pixel. Mỗi pixel là gồm một cặp toạ độ
x, y và màu. Cặp toạ độ x,y tạo nên độ phân giải (resolution). Màn hình máy
tính có nhiều loại với độ
phân giải khác nhau: 320 x 200, 640x350,
800x600, 1024x768,… •
Mức xám (Graylevel)
Mức xám là kết quả sự mã hoá tương ứng của mỗi cường độ sáng của
mỗi điểm ảnh với một giá trị số – kết quả của quá trình lượng hoá . •
Dữ liệu
Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh
Sinh viên thực hiện : Tạ Minh Thắng CT 702

Trang :
6

Trong một bài toán, dữ liệu bao gồm một tập các phần tử cơ sở mà ta gọi
là dữ liệu nguyên tử. Nó có thể là một chữ số, một ký tự, ... nhưng cũng có
thể là một con số, một từ, ... điều đó phụ thuộc vào từng bài toán. •
Nén dữ liệu

7
CHƯƠNG II:
CÁC PHƯƠNG PHÁP NÉN ẢNH

II.1.Cách phân loại các phương pháp nén ảnh: II.1.1.Cách phân loại dựa vào nguyên lý nén:

Nén bảo toàn thông tin (losses compression): bao gồm các phương pháp
nén mà sau khi giải nén sẽ thu đựơc chính xác dữ liệu gốc.Tuy nhiên nén
bảo toàn thông tin chỉ đạt hiệu quả nhỏ so với phương pháp nén không bảo
toàn thông tin.
Nén không bảo toàn thông tin (lossy compression): bao gồm các phương
pháp nén sau khi giải nén sẽ không thu được dữ liệu như bản gốc. Các
phương pháp này được gọi là “tâm lý thị giác” đó là lợi dụng tính chất của
mắt người chấp nhận một số
vặn xoắn trong ảnh khi khôi phục lại.Phương
pháp này luôn đem lại hiệu quả cao do loại bỏ đi những thông tin dư thừa
không cần thiết.

II.1.2.
Cách phân loại dựa vào cách thức thực hiện nén:


được thông tin cần thiết nhưng vẫn đảm bảo được chất lượ
ng ảnh.
Giải nén : dữ liệu nén đi qua bộ giải mã dữ liệu, bộ giải mã sẽ thực
hiện giải nén để thu được dữ liệu gốc ban đầu.Việc giải nén này thường phải
dựa vào các thông tin đi kém theo dữ liệu nén ,tuỳ thuộc vào kiểu nén hay
phương pháp nén mà dữ liệu giải nén được có hoàn toàn giống với dữ liệu
gốc ban đầu hay không.
Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh
Sinh viên thực hiện : Tạ Minh Thắng CT 702

Trang :
9

Tóm lại quá trình nén và giải nén dữ liệu có thể mô tả một cách tóm
tắt theo sơ đồ dưới đây:

Hình 2.1 : Quá trình nén và giải nén
II.2.Phương pháp mã hoá độ dài loạt RLE:

Mã hoá theo độ dài loạt RLE (Run Length Encoding) là một phương
pháp nén ảnh dựa trên sự cắt bớt các dư thừa về không gian (một vài hình
ảnh có vùng màu lớn không đổi đặc biệt đối với ảnh nhị phân). Loạt được
định nghĩa là dãy các phần tử điểm ảnh (pixel) liên tiếp có cùng chung một
giá trị.
II.2.1.Nguyên tắc :

Nguyên tắc của phương pháp này là phát hiện một loạt các điểm ảnh lặp
lại liên tiếp, ví dụ :110000000000000011 .Ta thấy điểm ảnh có giá trị 0 xuất
hiện nhiều lần liên tiếp thay vì phải lưu trữ toàn bộ các điểm ảnh có giá trị 0
ta chỉ cần lưu trữ chúng bằng cách sử dụng các cặp (độ dài loạt, giá trị).

Chú ý:


Đối với ảnh chiều dài của một dãy lặp có thể lớn hơn 255, nếu ta dùng 1
byte để lưu trữ chiều dài thì sẽ không đủ. Giải pháp được dùng là tách chuỗi
đó thành 2 chuỗi: một chuỗi có chiều dài là 255, chuỗi kia có chiều dài còn
lại.


Phương pháp nén RLE chỉ đạt hiệu quả khi chuỗi lặp lớn hơn 1 ngưỡng
nhất định nào đó hay nói các khác trong ảnh cần nén phải có nhiều điểm ảnh
kề nhau có cùng giá trị màu.Do đó phương pháp này không đem lại cho ta
kết quả một cách ổn định vì nó phụ thuộc hoàn toàn vào ảnh nén chỉ thích
hợp cho những ảnh đen trắng hay ảnh đa cấp xám.

Ví dụ:
Ta có một chuỗi ngu
ồn: d=5 7 9 11 13 18 28 38 48 58 30 35 40 45
Chuỗi kết quả sau khi mã hoá :
1 5 1 7 1 9 1 11 1 3 1 18 1 28 1 38 1 48 1 58 1 30 1 35 1 40 1 45
Tỷ số nén = 14 / 28 = 0.2

Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh
Sinh viên thực hiện : Tạ Minh Thắng CT 702

Trang :
11

Như vậy chuỗi sau khi mã hoá đã lớn hơn nhiều chuỗi nguồn ban đầu.
Do đó cần phương pháp cải tiến để xử lý những trường hợp như trên tránh


Trang :
12•
Tiến hành duyệt trên từng hàng cho đến khi kết thúc vùng dữ liệu
ảnh, trong quá trình duyệt tiến hành kiểm tra để tìm ra những loạt có cùng
giá trị đồng thời chú ý những kí hiệu xuống dòng (hay kết thúc dòng) ,kết
thúc ảnh Bitmap, …


Khi gặp loạt có độ dài > 3 thì nhảy đến chế độ nén ngược lại nhảy
đến chế độ không nén tuy nhiên nếu loạt > 255 thì sẽ tách ra chỉ mã < 255
sau đó mã tiếp phần còn lại. Ngoài ra còn các chế độ khác như : bắt đầu , kết
thúc 1 dòng.


Kết thúc khi gặp kí hiệu kết thúc bitmap ( end – o f- bitmap)
II.2.3.Một số thủ tục chương trình :•
Chương trình nén theo phương pháp RLE :
void CRLE::CompressInRLE8(BYTE*pSrcBits,CByteArray& pRLEBits, int&
RLE_size)
{

pRLEBits[dst_index++] = 1;
pRLEBits[dst_index++] = pSrcBits[src_index++];
goto state_compress;
}
else
goto state_no_compress;
state_compress:
for ( counter = 1; counter <= 254; counter++)
{
if ( pSrcBits[src_index+counter] != pSrcBits[src_index] )
break;
if ( EndOfLine(src_index+counter) )
{
pRLEBits[dst_index++] = counter+1;
pRLEBits[dst_index++] = pSrcBits[src_index];
src_index += counter +1;
goto end_of_line;
}
Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh
Sinh viên thực hiện : Tạ Minh Thắng CT 702

Trang :
14

}
pRLEBits[dst_index++] = counter;
pRLEBits[dst_index++] = pSrcBits[src_index];
src_index += counter;
goto state_start;
state_no_compress:

if ( 0 != ((counter+1) % 2) ) pRLEBits[dst_index++];
goto state_compress;
}
}
pRLEBits[dst_index++] = 0;
pRLEBits[dst_index++] = counter;
for (i = counter; i > 0; i--)
pRLEBits[dst_index++] = pSrcBits[src_index++];
if ( 0 != ((counter) % 2) )
pRLEBits[dst_index++];
goto state_start;
end_of_line:
if ( 0 != (src_index % 4 ))
{
int pad = 4 - (src_index%4);
src_index += pad;
}
pRLEBits[dst_index++] = 0;
pRLEBits[dst_index++] = 0;
}

pRLEBits[dst_index++] = 0;
pRLEBits[dst_index++] = 1;
RLE_size = dst_index;
}


Chương trình giải nén phương pháp RLE :
BOOL CRLE::DecRLE8(ifstream &fil, BYTE *pDest)
{

break;
default:
char ch;
for (BYTE i = 0; i < SecondByte; i++)
{
if (!fil.get(ch)) return FALSE;
pDest[paddedwidth * y + x++] = (BYTE)ch;
Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh
Sinh viên thực hiện : Tạ Minh Thắng CT 702

Trang :
17

}
if ((SecondByte % 2) == 1)
if (!fil.get(ch)) return FALSE;
}
}
else
{
for (BYTE i = 0; i < FirstByte; i++)
pDest[paddedwidth * y + x++] = SecondByte;
}
}
return FALSE;
}


Tính tần suất của các ký tự trong dữ liệu gốc bằng cách duyệt tệp
gốc một cách tuần tự từ đầu đến cuối để xây dựng bảng mã và tính toán tần
suất. Tiếp theo sau là sắp xếp lại bảng mã theo thứ tự tần suất giảm dần.

Bước hai:
Duyệt bảng tấn suất từ cuối lên đầu để thực hiện ghép hai phần tử
có tần suất thấp thành một phần tử duy nhất có tần suất bằng tổng hai tần
suất thành phần. Cập nhật phần tử này vào vị trí phù hợp trong bảng và loại
bỏ hai phần tử đã xét. Thực hiện cho đến khi bảng chỉ có một phần tử. Đây
là quá trình tạo cây nhị phân Huffman ,phần tử có tần suất thấp ở bên phải,
phần tử kia ở bên trái. Sau khi cây đã tạo xong người ta tiến hành gán mã
cho các nút lá. Việc mã hoá thực hiện theo quy định : mỗi lần xuống bên
phải ta thêm một bit ‘1’ vào từ mã, mỗi lần xuống bên trái ta thêm một bit
‘0’ vào từ mã.
Quá trình giải nén cũng khá đơn giản được tiến hành theo chiều ngược
lại. Người ta cũng phải dựa vào bảng mã tạo ra trong giai đo
ạn nén (bảng
này được lưu trữ trong cấu trúc đầu của tệp nén cùng với dữ liệu nén).
Ví dụ: Một tệp bất kỳ có tần suất xuất hiện của các kí tự số như bảng sau.
Ký tự Tần suất
0 1532
Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh
Sinh viên thực hiện : Tạ Minh Thắng CT 702

Trang :
19

1
2
3 Kí tự Xác suất (%)
0
6
3
5
2
4
1
8
7
9
0.3906
0.1535
0.1051
0.0982
0.0824
0.0577
0.0388
0.0286
0.0235
0.0222
0.3905
0.6100
0.3905
0
6

0.1051
0.1034
0.0982
0.08240.0674
0.3905
0.1535
0.1498
0.1051
0.10340.0982
0.3905
0.2016
0.1535
0.1498
0.1051
0.3905
0.2549
0.2016
0.1535
0.3905
0.3551
0.2549
0.0286
0.0388
0.1535

1. Tất cả những ký tự ban đầu được xem như là những ký tự giao điể
m
tự do.
2. Hai nút tự do với tần số xuất hiện thấp nhất được phân công tới một
nút gốc với giá trị bằng với tổng của hai nút con tự do.
3. Hai nút con được chuyển khỏi danh sách nút tự do. Chuyển nút gốc
mới tạo thành công vào danh sách.
4. Bước hai sang bước ba được lặp cho đến khi chỉ có 1 nút tự do về
phía trái. Nút tự do này là gốc của cây.
Quá trình xây dựng cây nhị phân Huffman được thể hiện chi tiết như
trong hình sau :
B0
0 6 3 5 2 4 1 8 7 9

B1
0 6 3 5 2 4 1 8

B2
0 6 3 5 2 4
7
9
1
8
Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh

Ta có cây mã Huffman tương ứng như sau : 0 1
0
Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh
Sinh viên thực hiện : Tạ Minh Thắng CT 702

Trang :
22
Bảng từ mã gán cho các kí tự số như sau:

Kí tự Mã
0
6
3
5
2

Tỷ số nén = 160 / 43 = 3.7

Trong phương pháp mã Huffman mã của ký tự là duy nhất và không mã
nào là phần bắt đầu của mã trước.Vì vậy khi đọc theo từng bit từ đầu đến
cuối tệp nén ta có thể duyệt cây mã cho đến một lá, tức là ký tự đã được giải
mã. Việc giải mã chắc chắn phải sử dụng cây nhị phân giống như trong mã
hoá. Để đọc, giải mã được yêu cầu phải sử dụng theo đúng tiêu chuẩn nhất
định . II.3.3.Một số thủ tục chương trình :

Chương trình nén phương pháp HUFFMAN :

bool CompressHuffman(BYTE*pSrc, int nSrcLen, BYTE *&pDes, int
&nDesLen)
{
CHuffmanNode nodes[511];
for(int nCount = 0; nCount < 256; nCount++)
nodes[nCount].byAscii = nCount;
for(nCount = 0; nCount < nSrcLen; nCount++)
nodes[pSrc[nCount]].nFrequency++;
qsort(nodes, 256, sizeof(CHuffmanNode), frequencyCompare);
int nNodeCount = GetHuffmanTree(nodes);
int nNodeSize = sizeof(DWORD)+sizeof(BYTE);
nDesLen = nSrcLen+nNodeCount*nNodeSize;
Đồ án tốt nghiệp Tìm hiểu một số phương pháp nén ảnh
Sinh viên thực hiện : Tạ Minh Thắng CT 702

Trang :


Trích đoạn II.4.Phương pháp mã hoá LZW:
Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status