Tải bản đầy đủ

Nén ảnh dựa trên phép biến đổi wavelet rời rạc và tiêu chuẩn JPEG2000

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
----------

Báo cáo Bài tập lớn môn:
Xử lí dữ liệu đa phương tiện
Đề Tài 10:

Nén ảnh dựa trên phép biến đổi
Wavelet rời rạc và chuẩn JPEG2000
Giảng viên hướng dẫn: PGS.TS. Nguyễn Thị Hoàng Lan
Sinh viên thực hiện:
Ngô Quang Anh
Nguyễn Huy Hoàng
Nguyễn Hiển Tường

MSSV:
20121209
20121749
20122776


Hà Nội – 05/2016

Lớp:
CNTT-TT 1.01 K57
CNTT-TT 1.01 K57
CNTT-TT 1.01 K57


Mục lục


Tổng quan về JPEG-2000

I.

1. Lịch sử ra đời và phát triển chuẩn JPEG2000
JPEG viết tắt của Joint Photographic Experts Group là nhóm cộng tác giữa hai tổ
chức: ISO ( the International Origanization for Standardization) và ITUT ( International
Telecommunication Union Standardization Sector ) đã sang lập ra chuẩn JPEG. Sự ra đời
của JPEG mạng lại nhiều lợi ích to lớn về nhiều mặt. JPEG giảm 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à tốt hơn. Tuy
nhiên cho đến nay, người ta cũng mới chỉ ứng dụng dạng nén có tổn thất thông tin của
JPEG vì mã hóa 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 tĩnh mới là JPEG2000. JPEG2000 sử
dụng biến đổi Wavelet và một số phương pháp mã hóa đặ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 nghiên cứu phát triển, nhưng
đã được tổ chức ISO công 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 Wavalet với những tính năng vượt
trội so với JPEG chắc chắn sẽ được dung cho các server nội dung để chuyển đổi định
dạng ảnh trong mạng di động.

2. Các tính năng của JPEG2000
JPEG2000 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ị lũy tiến về chất lượng, về độ phan 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ã hóa 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 khác nhau tùy theo yêu cầu
của người sử dụng.
Hiện tại, ISO và ủy ban JPEG đã đưa ra khuyến nghị thay thế JPEG bằng JPEG2000.


3. Các bước thực hiện nén ảnh theo chuẩn JPEG2000
3.1

Xử lý trước khi biến
đổi ( preprocessing)
Do
biến

sử dụng
đổi
Wavalet,

JPEG2000 cần có dữ liệu ảnh
đầu vào ở dạng đối xứng qua 0, ví dụ đối với ảnh grayscale, giá trị
pixel
phải
nằm
trong
miền từ
[-128, 128]. Xử
ly trước biến đổi chính là
giai đoạn đảm bảo dữ liệu đưa vào nén ảnh có dạng trên.
Ở phía
giải mã, giai đoạn xử lý sau biến đổi sẽ trả lại giá trị gốc
ban đầu
cho dữ liệu ảnh.

3.2

Biến đổi liên
transform)

thành

phần

(Intercomponent

Giai đoạn này sẽ loại bỏ tính tương quan giữa các thành phần của ảnh. JPEG2000 sử
dụng hai loại biến đổi liên thành phần đó là biến đổi thận ngịch ( Reverrsible Color
Transform – RCT) và biến đổi màu không thuận ngịch (Irrerrsible Color Transform –
ICT) trong đó biến đổi thuận ngịch làm việc với các giá trị nguyên. ICT và RCT chuyển
dữ liệu ảnh từ không gian màu RGB sang YCrCb. RCT được áp dụng cho nén có tổn thất.
Việc áp dụng các biến đổi màu trước khi nén ảnh không nằm ngoài mục đích làm tăng
hiệu quả nén. Các thành phần Cr, Cb có ảnh hưởng rất ít tới sự cảm nhận hình ảnh của
mắt trong khi
thành phần độ chói Y có
ảnh
hướng rất lớn
tớt ảnh.

Ví dụ
hình

minh họa ở
dưới.


Sau đây là các phương trình biến đổi giữa hai không gian màu
Phương trình biến đổi từ YCbCr sang RGB:

Phương trình biến đổi từ RGB sang YCbCr

3.3

Biến đổi riêng thành phần (Intracomponent transform) – biến đổi
Wavalet.
Biến đổi riêng thành phần được áp dụng trong JPEG2000 chính là việc biến đổi Wavalet.
Để đảm bảo tính toàn vẹn thông tin cần phải áp dụng các phép biến đổi thuận ngịch hoặc
không thuận ngịch. Do phép biến đổi Wavalet không phải là một phép biến đổi trực giao
như biến đổi DCT mà là một phép biến đổi băng con nên các thành phần sẽ được chia
thành các băng tần số khác nhau và mỗi băng sẽ được mã hóa riêng rẽ.


DWT sẽ phan tách ảnh ra thành nhiều dải tần số gọi là các subband. Mỗi mức DWT sẽ
được tác động 2 lần : một lần duyệt theo chiều ngang và một lần duyệt theo chiều dọc và
do đó ta thu được bốn dải :
1)
2)
3)
4)

Horizontally and vertically lowpass (LL)
Horizontally lowpass and vertically highpass (LH)
Horizontally highpass and vertically lowpass (HL)
Horizontally and vertically highpass (HH)

Chúng ta sẽ xem xét tín hiệu ảnh đầu vào ( hoặc tín hiệu tile – component đối với ảnh
lớn). Giả sử với sự phân tách wavelet mức R-1 tương ứng với mức phân giải thứ R, đánh
số từ 0 tới R-1 thì 0 tương ứng với mức phân giải kém nhất (coarsest resolution) và R-1
tương ứng với mức phân giải tốt nhất (finest resolution). Mỗi một dải trong một lần phân
tách sẽ được xác định bởi hướng (orientation) của chính nó ( ví dụ LL, LH, HL, HH) và
mức phân giải tương ứng của nó ( ví dụ 0,1,…, R-1). Tại mỗi mức phân giải ( ngoại trừ
mức thấp nhất), dải LL là dải sẽ bị phân tách nhỏ hơn. Giả dụ, dải LLR-1 là dải sẽ bị phân
tách thành các dải LLR-2, HLR-2, LHR-2 và HHR-2. Sau đó, tại mức tiếp theo dải LLR-2 sẽ bị
phân tách và cứ như vậy. Quá trình này sẽ lặp đi lặp lại cho tới khi ta thu được dải
LL0(kết quả hiển thị hình b ở trên) . Nếu không thực hiện biến đổi (R=0) thì chỉ có duy
nhất dải LL0.


JPEG2000 áp dụng biến đổi Wavalet nguyên thuận nghịch 5/3 (the reversible integer-tointeger) (IWT) và biến đổi không thuận nghịch (the irreversible real-to-real) Daubechies
9/7. Việc tính toán biến đổi trong JPEG2000 này sẽ được thực hiện theo phương pháp
Lifting.
Sơ đồ phương pháp Lifting 1D áp dụng trong JPEG2000 trên hình. Việc tính toán
biến đổi
Wavalet 1D
2D
được
suy
ra từ biến đổi Wavalet 1D
theo các
phương
pháp giải
ảnh tùy
chọn.
Trong JPEG2000, có
ba phương pháp giải ảnh nhưng
phương pháp được sử
dụng nhiều nhất là
phương
pháp kim tự tháp.
Do biến đổi
Wavalet 5/3 là
biến đổi
thuận ngịch
nên
có thể áp
dụng
cho nén ảnh theo cả 2 phương
pháp, có tổn thất và không tổn thất. Trong khi biến đổi 9/7 chỉ áp dụng cho nén ảnh theo
phương pháp có tổn thất thông tin.

3.4

Lượng tử hóa
Các hệ số của phép biến đổi sẽ được tiến hành lượng tử hóa. Quá trình lượng tử hóa
(quantization) cho phép đạt tỉ lệ nén cao hơn bằng cách thể hiện giá trị biến đổi với độ
chính xác tương ứng cần thiết với các mức chi tiết của ảnh cần nén. Các hệ số biến đổi
được lượng tử hóa theo phép lượng tử hóa vô hướng. Các hàm lượng tử hóa khác nhau sẽ
được áp dụng cho các băng con khác nhau và được thực hiện theo biểu thức:

Trong dạng biến đổi nguyên, đặt bước lượng tử bằng 1. Với dạng biến đổi thực thì bước
lượng tử sẽ được chọn tương ứng cho từng băng con riêng rẽ. Bước lượng tử của mỗi
băng do đó phải có ở trong dòng bit truyền đi để phía thu có thể giải lượng tử cho ảnh.

3.5

Mã hóa tầng thứ nhất (Tier-1 encoder)


Đến đây, mỗi dải sẽ được chia ra thành các hình chữ nhật có độ dài không chồng lên
nhau. Ba hình chữ nhật tương ứng với các dải HL, LH, HH trong mỗi mức phân giải sẽ
được gộp lại trong một gói (packet). Mỗi packet sẽ cung cấp thông tin về không gian vì
nó có chứa các thông tin cần cho việc giải mã hóa ảnh tại vùng không gian đó và trong
mức phân giải đó. Các gói còn được chia nhỏ hơn thành các khối mã ( codeblock) hình
chữ nhật không chồng lên nhau, đó là các thực thể cơ bản trong việc mã hóa entropy. Một
codeblock phải có chiều dài và rộng là lũy thừa của 2 và sản phẩm của nó, kích thước
định danh – đối số tự do – không được vượt quá 4096. Trong đó JPEG2000, kích cỡ mặc
định của mỗi codeblock là 64x64.
Sau đó, các codeblock sẽ được mã hóa một cách độc lập bằng cách dung bộ mã hóa theo
bit-plane ( bit-plane coder) có hai đặc điểm riêng, đó là nó không phụ thuộc vào dải bên
trong và ba pass coding (ví dụ các pass cleanup, refinement và significance) một bit –
plane thay vì hai pass coding. Đặc điểm thứ nhất đảm bảo mỗi code block sẽ được chứa
hoàn toàn trong một dải đơn và các code block sẽ được mã hóa hoàn toàn độc lập với các
code block khác: vì thế mà có khả năng phục hồi lỗi. Đặc điểm thứ 2 làm giảm lượng
thông tin liên két với mỗi pass coding, làm cho việc điều khiển tỉ lệ tốt hơn. Mỗi một pass
trong số này sẽ quét các mẫu (sample) của một codeblock dưới dạng các stripes theo
chiều dọc ( mỗi stripes có chiều cao định dang là 4 mẫu). Thứ tự quét là từ trên xuống
dưới trong một stripe còn các cột được quét từ trái sang phải. Trong một cột, các mẫu
được quyets từ trên xuống dưới.
Pass cleanup bắt buộc đòi hỏi mã hóa toán học (arithmetic coding) nếu không có các pass
khác nó cũng có thể đòi hỏi việc mã hóa thô (raw coding). Đối với khả năng phục hồi lỗi,
quy trình mã hóa toán học, mã hóa thô sẽ đảm bảo cho các mẫu bit nào đó bị cấm trong
đầu ra. Mã hóa bit-plane sẽ đưa ra chuỗi các kí hiệu cho mỗi coding pass, một số hoặc tất
cả các kí hiệu này có thể được mã hóa etropy thông qua bộ mã hóa toán học nhị phân
tương hợp dựa vào ngữ cảnh ( context_based adaptive binary arithmetic coder). Đối với
việc chọn ngữ cảnh, thông tin trạng thái cho các láng giềng-4 và láng giềng-8 đặt trong tài
khoản.

Ngữ cảnh phụ thuộc vào các bit đã được mã hóa sẽ phân loại các bit và các tín hiệu
(signs) thành các lớp khác nhau cần cho sự phân bổ xác suất đồng dạng độc lập. Cho số
lớp bằng N và có ni trong lớp I, với xác suất của các bit, để lấy được giá trị “1”, là pi thì
entropy (H) của mảng bit theo thuyết thông tin của Shannon được tính bằng :


Mã hóa entropy sẽ biến đổi các cặp bit và ngữ cảnh này thành dòng bit đã được nén với
độ dài gần đạt tới lý tưởng, ví dụ giới hạn Shannon, là hoàn toàn có thể được. Có rất
nhiều bộ mã hóa (coder) như thế và JPEG2000 đã sử dụng bộ mã hóa coder theo chuẩn
JBIG2, ví dụ MQ[10].

3.6

Mã hóa tầng thứ 2 (Tier-2 encoder)
Trong bước này, các thông tin của coding pass được đóng gói lại trong các đơn vị dữ liệu
gọi là các packets bởi quá trình packetization, quá trình này buộc cách tổ chức riêng biệt
thành dữ liệu coding pass trong dòng mã đầu ra (output code stream) vì thế rất thuận lợi
để đạt các đặc tính mã hóa mong muốn gồm có: thay đổi tỉ lệ ( rate scalability) và phục
hồi lũy tiến với độ chính xác và độ net. Header của packet sẽ cho biết nó chứa coding
pass nào, trong khi đó phân thân chứa dữ liệu coding pass thực của chính nó. Đối với việc
thay đổi tỉ lệ (rate scalability) cho mỗi tile được tổ chức thành một hoặc nhiều tầng, được
đánh số từ 0 đến l-1, với l là số tầng. Các tầng thấp hơn chứa các coding pass có dữ liệu
quan trọng nhất, trong khi đó các tầng trên có các coding pass chưa các chi tiết nên nó
cho phép bộ giải mã xây dựng lại hình ảnh với chất lượng được cải thiện với số gia. Việc
nén mất mát thông tin cần loại bỏ một số coding pass bằng các loại bỏ nó ở bất kỳ lớp
(layer) nào trong khi nén không mất mát thông tin không loại bỏ bất kì coding pass nào.
Các code block từ mã hóa tier-& được nhóm lại và được gọi là các precincts. Đối với mỗi
kết hợp thành phần – mức phân giải – lớp – khu (component-resolution-layer-precinct
combination), một gói sẽ được tạo ran gay cả khi nó không truyền đi thông tin gì cả: gói
rỗng. Một phân khu precinct cho mỗi dải được lấy từ phân khu của dải LL cha của nó.
Mỗi mức phân giải có kích thước precinct định dang riêng và nó phải là lũy thừa của 2
nhưng không vượt quá 215. Kích thước của precinct nhỏ hơn sẽ giảm lượng dữ liệu được
chứa trong mỗi gói vì thực tế là dữ liệu của coding pass của các precinct khác nhau được
mã hóa trong các gói riêng biệt. Do đó với dữ liệu ít hơn trong mỗi gói sẽ dẫn tới mất mát
thông tin ít hơn, khả năng phục hồi lỗi tốt hơn với cùng chi phí cho hiệu suất mã hóa vì
mật độ gói được tăng lên.

II.
-

Thuật toán nén ảnh trong JPEG-2000 (Thuật toán EZW Embeded Zerotree Wavelet)

Cây tứ phân: Như đã trình bày ở phần kĩ thuật thực hiện Wavelet, sau khi thực
hiện phép biến đổi này thì ta thu nhận được các hệ số ở các băng tần con khác
nhau và có thể được sắp xếp lại một cách khái quát như hình trên, trong đó dữ
liệu (hình ảnh) gốc được chia đều làm bốn phần tương ứng với các băng tần LL,
HL, LH, HH. Đặc điểm của các hệ số này là giá trị rất lớn tập trung ở băng tần
thấp (LL), ngoài ra các băng tần còn lại chứa các hệ số có giá trị thấp hơn, đặc
biệt ở HH các giá trị rất nhỏ và gần 0.


-

Cây không (zerotree): Phương pháp này được xây dựng dựa trên nhận xét: nếu
coi cấu trúc các băng tần con sau biến đổi Wavelet có dạng hình cây mô tả như
hình vẽ thì nếu nút cha có giá trị không đáng kể thì các nút con cũng có giá trị
không đáng kể; ngoài ra nếu nút cha là 0 thì các nút con cũng hầu hết là 0, nghĩa
là không tạo ra sự khác biệt lớn nếu chỉ được lưu là 0 hay lưu chi tiết hơn.

Vì vậy, nếu đem quét tập giá trị hệ số Wavelet này theo một cách nào đó để xây
dựng được rừng đã mô tả ở trên thì sẽ có những cây toàn số không, gọi là cây không
(zerotree) hay ít nhất là giá trị không đáng kể. Những cây này hoàn toàn có thể được thay
thế bằng một kí tự duy nhất, kết quả là tập hệ số được nén lại khá nhiều.
Nguyên lý hoạt động của thuật toán: Thuật toán sẽ mã hóa các hệ số theo thứ tự
giảm dần. Chúng ta sẽ dùng một giá trị gọi là ngưỡng và sử dụng ngưỡng này để tiến
hành mã hóa các hệ số biến đổi. các hệ số được mã hóa theo thứ tự từ vùng tần số thấp
đến vùng tần số cao. Và chỉ những hệ số có giá trị tuyệt đối lớn hơn hoặc bằng ngưỡng
thì mới dc mã hóa. Tiếp theo giảm ngưỡng và tiếp tục làm như vậy cho tới khi ngưỡng
đạt tới giá trị nhỏ hơn giá trị của hệ số nhỏ nhất. Các giảm giá trị ngưỡng ở đây thực hiện
tương đối đặc biệt, giá trị của ngưỡng giảm xuống một nửa so với trước đó. Bộ giải mã
phải biết các mức ngưỡng này thì mới có thể giải mã ảnh thành công.
Ngưỡng đầu tiên được tính theo công thức:

Với một ngưỡng nào đó, đưa các hệ số qua hai vòng kiểm soát (pass), cụ thể:


Significant pass: Các hệ số được xác định tính đáng kể sau đó sẽ được mã hóa thành
một trong 4 kí tự ‘p’, ‘n’, ‘t’, ‘z’, trong đó:
o ‘p’ – positive significant: giá trị tuyệt đối của hệ số dương lớn hơn
ngưỡng đang xét.


‘n’ – negative significant: giá trị tuyệt đối của hệ số âm lớn hơn ngưỡng
đang xét.
o ‘z’ – insignificant with significant descendants: giá trị tuyệt đối của hệ
số nhỏ hơn ngưỡng đang xét, nhưng trong các con của nó có hệ số có trị
tuyệt đối lớn hơn, tức là có ít nhất một con là đáng kể.
o ‘t’ – zerotree root: gốc cây không, tức là trị tuyệt đối giá trị hệ số ở đây
không đáng kể và các con của nó cũng thế.
Refinement pass: Các hệ số đã được mã hóa ‘p’ hay ‘n’ sẽ được xét giá trị cụ thể và
cho ra ‘0’ hoặc ‘1’
o



Sử dụng một thuật toán quét (scan) các giá trị hệ số bảo đảm yêu cầu: hệ số ở mức
thực hiện Wavelet cao hơn được quét trước, mức Wavelet thấp hơn được quét sau; hệ số
ở băng tần thấp được quét trước rồi tới hệ số băng tần cao. Thông thường có thể áp dụng
Morton Scan là hình chữ Z:

1

Ví dụ về
a. Mã

Bước 1:
Cmax= 57

EZW
hóa


To = 2^5 = 32
Xét các giá trị theo Morton Scan
A3 = 57 > 32 => A3= P
H3 = -35 |-35| > 32 => H3= N
V3 = -29 |-29| < 32 nhưng có con ở trong V1 có giá trị là 47 > 32 => V3= Z
D3 = 25 < 32 nhưng không có giá trị nào trong các con D2 và D1 > 32 => D3 = T
⇒ [A3, H3, V3, D3] = PNZT
Tiếp tục theo Morton Scan ta xét đến các vùng H2, V2, D2 tro đến khi các cây đều là
zerotree
Tương tự ta có H2 = PTTT, V2 = TZTT
D2 không cần mã hóa do D3 đã là cây zero
Tiếp tục mã hóa ở bước này ta sẽ được dãy: PNZT PTTT TZTT TTTT TPTT
Tiếp theo ta mã hóa các giá trị P và N, ta sẽ lấy dọc theo bit thứ 2 của các giá trị

Sau khi hoàn thành ta thu được

Bước 2:


Bước thứ 2 ta giảm ngưỡng xuống 1 nửa là còn 16
Tiếp tục theo Morton Scan Ta sẽ thu được P2 = ZTNPTTTTTTTT
Các giá trị vượt ngưỡng sẽ là : 57 35 52 47 29 25, các giá trị ở bước 2 này sẽ lần lượt
được ghi sau các giá trị ở bước 1
Mã hóa các giá trị lần này sẽ lấy dọc các bit thứ 3 ta dc S2 = 100111
Cứ tiếp tục đến khi ngưỡng đạt giá trị thấp nhất ta được

Sau cùng ta dùng mã Huffman để ra dòng dữ liệu nhị phân

b. Giải Mã

P sẽ nhận giá trị Tn, N sẽ nhận giá trị -Tn
Z và T sẽ không nhận giá trị nào cả
Cứ mỗi lần cộng thêm S, giá trị Tn sẽ giảm đi 1 nửa
1 sẽ nhận giá trị Tn, 0 thì không có j cả
Thứ tự xét sẽ vẫn theo Morton Scan
Bước 1:


Xét P1, các giá trị P = To = 32, N = -To = -32, Z = T = 0
Các giá trị được điền theo mô hình Morton Scan như khi mã hóa
Xét S1, các giá trị 1,0,1,0 sẽ được cộng vào các giá trị P và N tương ứng ở P1
1 = 1/2To = 16, Thêm 16 nếu là P và – 16 nếu là N
Các giá trị 0 thì không thêm gì
Bước 2:
Ngưỡng ở P2 vẫn là 16
Ngưỡng ở S2 giảm 1 nửa còn lại 8
Cứ tiếp tục như vậy đến khi ta giải mã xong

Về cơ bản thì giải mã thực hiện ngược lại của mã hóa

III.
1

Xây dựng, cài đặt thử nghiệm thuật toán nén ảnh JPEG2000

Chuẩn bị
-

Phần mềm Matlab R2015b
Ảnh nguồn: lena256.bmp với kích thước 256x256 pixel


1.

Kịch bản và tiến hành thử nghiệm
-

-

Kịch bản:
o Tiến hành cài đặt các thuật toán cần thiết trên matlab
o Chạy thuật toán với các thông số khác nhau
o Đo các thông số của output để so sánh
Các thông số cần đo
o PSNR – Tỉ số tín hiệu cực đại trên nhiễu: : là tỉ lệ giữa giá trị năng lượng
tối đa của một tín hiệu gốc và năng lượng nhiễu (các lỗi khi nén có mất
mát dữ liệu).
o PSNR được tính thông qua MSE:dung cho ảnh kích thước mxn trong đó I
là ảnh gốc, K là ảnh khôi phục:

Khi đó:

MAXI là giá trị tối đa của pixel trên ảnh. khi tín hiệu được biểu diễn bởi B
bits trên một đơn vị lấy mẫu, MAXI = 2^B−1. Với ảnh màu RGB, MSE là
tổng của 3 giá trị màu đó chia cho kích thước của ảnh và chia cho 3.
Trong nén ảnh có mất mát, PSNR trong khoảng 30-50dB, giá trị càng cao
càng tốt. Giá trị có thể chấp nhận được khi truyền tín hiệu không dây có
tổn thất khoảng từ 20 dB đến 25 dB.
2.

Cài đặt thuật toán


Dựa trên sơ đồ biến đổi trên phần lý thuyết, ta thực hiện cài đặt thuật toán theo sơ
đồ

a. Biến đổi thuận liên thành phần
-

Ta sử dụng biến đổi DWT – SPIHT
Sử dụng bộ lọc Wavelet filters do Matlab cung cấp, ta lấy các thông số bộ lọc
thông thấp, thông cao cho phân rã và thông số thông thấp thông cao cho tái cấu
trúc từ câu lệnh trong matlab:
[Lo_D,Hi_D,Lo_R,Hi_R] = wfilters(wname);

-

-

Trong đó:
o Lo_D: phân rã lọc thông thấp
o Hi_D: phân rã lọc thông cao
o Lo_R: tái cấu trúc thông thấp
o Hi_R: tái cấu trúc thông cao
Tiến hành biến đổi DWT
[img_wave,S] = func_DWT(img,level,Lo_D,Hi_D);

-

Trong đó hàm func_DWT sẽ thực hiện phân tách ảnh ra thành nhiều dải tần số
gọi là các subband. Mỗi mức DWT sẽ được tác động 2 lần : một lần duyệt theo
chiều ngang và một lần duyệt theo chiều dọc và do đó ta thu được bốn dải
Tương ứng code trên Matlab, ta có:
function [I_W , S] = func_DWT(I, level, Lo_D, Hi_D)
[C,S] = func_Mywavedec2(I,level,Lo_D,Hi_D);
S(:,3) = S(:,1).*S(:,2);

% dim of detail coef nmatrices

L = length(S);
I_W = zeros(S(L,1),S(L,2));
% approx part
I_W( 1:S(1,1) , 1:S(1,2) ) = reshape(C(1:S(1,3)),S(1,1:2));


for k = 2 : L-1
rows = [sum(S(1:k-1,1))+1:sum(S(1:k,1))];
columns = [sum(S(1:k-1,2))+1:sum(S(1:k,2))];
% horizontal part
c_start = S(1,3) + 3*sum(S(2:k-1,3)) + 1;
c_stop = S(1,3) + 3*sum(S(2:k-1,3)) + S(k,3);
I_W( 1:S(k,1) , columns ) = reshape( C(c_start:c_stop) ,
S(k,1:2) );
% vertical part
c_start = S(1,3) + 3*sum(S(2:k-1,3)) + S(k,3) + 1;
c_stop = S(1,3) + 3*sum(S(2:k-1,3)) + 2*S(k,3);
I_W( rows , 1:S(k,2) ) = reshape( C(c_start:c_stop) , S(k,1:2)
);
% diagonal part
c_start = S(1,3) + 3*sum(S(2:k-1,3)) + 2*S(k,3) + 1;
c_stop = S(1,3) + 3*sum(S(2:k,3));
I_W( rows , columns ) = reshape( C(c_start:c_stop) ,
S(k,1:2) );
end

b. Lượng tử hóa
- Ta thực hiện lượng tử hóa với công thức
: hệ số Wavelet tại vị trí , băng tần con .
: hàm lấy dấu.
: hệ số Wavelet sau khi lượng tử hóa thành số nguyên.
: bước lượng tử hóa, thay đổi theo từng băng tần con của bộ lọc Wavelet:

: nominal dynamic range của băng tần con , bằng tổng số bit ban đầu biểu
diễn một pixel ảnh và độ tăng ích của bộ lọc tại băng tần con này.
: số bit biểu diễn phần mũ (exponent) của hệ số Wavelet.
: số bit biểu diễn phần cơ số (mantissa) của hệ số Wavelet.
-

Ta xây dựng hàm lượng tử hóa với công thức ở trên như sau:
function Qtable = testquant(row, col, l)
R=8;c=11;f=52;i=l;
t = (1+f/2^11)*2^(R-c+i);


Qtable = zeros(row,col);
for level=1:i
end_x = uint16(row/(2^(level-1)));
end_y = uint16(col/(2^(level-1)));
end_x2 = uint16(end_x/2);
end_y2 = uint16(end_y/2);
Qtable(1:end_x2,1:end_y2) = t/(2^level); %CA part
Qtable(end_x2+1:end_x,1:end_y2) = t/(2^(level-1)); %CH part
Qtable(1:end_x2,end_y2+1:end_y) = t/(2^(level-1)); %CV part
Qtable(end_x2+1:end_x,end_y2+1:end_y) = t/(2^(level-2)); %CD
part
end;

c.
-

Mã hóa, thực hiện biến đổi EZW
Xây dựng hàm mã hóa theo EZW
function [significance_map, refinement] =
func_ezw_enc2(img_wavedata,maxloop);
subordinate_list = [];
refinement = [];
significance_map = [];
img_wavedata_save = img_wavedata;
img_wavedata_mat = img_wavedata;
% calculate Morton scan order
n = size(img_wavedata,1);
scan = func_morton([0:(n*n)-1],n);
% calculate initial threshold
init_threshold = pow2(floor(log2(max(max(abs(img_wavedata))))));
threshold = init_threshold;
while (maxloop>0)
[str, list, img_wavedata] = func_dominant_pass(img_wavedata,
threshold, scan);
significance_map = strvcat(significance_map, char(str));
if(threshold == init_threshold),
subordinate_list = list;
else
subordinate_list = func_rearrange_list(subordinate_list,
list, scan, img_wavedata_save);
end
[encoded, subordinate_list] =
func_subordinate_pass(subordinate_list, threshold);
refinement = strvcat(refinement, strrep(num2str(encoded), '
', ''));
threshold = threshold / 2;
maxloop = maxloop - 1;


end

-

Thực hiện mã hóa với ảnh sau khi lượng tử với đoạn code:
init_threshold =
pow2(floor(log2(max(max(abs(img_wave_quantized))))));
[img_enc_significance_map, img_enc_refinement] = ...
func_ezw_enc2(img_wave_quantized, maxloop);
[img_ezw_stream_bit] = testhuff(img_enc_significance_map,
img_enc_refinement,maxloop);

-

Sau khi thực hiện các phép biến đổi trên, ta thu được ảnh sau khi mã hóa, thực
hiện các phép biến đổi ngược để thu được ảnh khôi phục

-

Xây dựng hàm giải mã EZW:
function img_wavedata_dec = func_ezw_decode(dim, threshold,
significance_map, refinement);
img_wavedata_dec = zeros(dim,dim);
% calculate Morton scan order
scan = func_morton([0:(dim*dim)-1],dim);
% number of steps significance map (and refinement data)
steps = size(significance_map,1);
for step = 1:steps,
% decode significancemap for this step
img_wavedata_dec =
func_decode_significancemap(img_wavedata_dec,
significance_map(step,:), threshold, scan);
img_wavedata_dec = func_decode_refine(img_wavedata_dec,
refinement(step,:), threshold, scan);
threshold = threshold/2;
end

-

Thực hiện biến đổi giải mã hóa EZW
img_dec_significance_map = img_enc_significance_map;
img_dec_refinement = img_enc_refinement;
img_wave_dec = ...
func_ezw_dec(size_row, init_threshold,
img_dec_significance_map, img_dec_refinement);


d. Biến đổi giải lượng tử hóa:
-

Thực hiện với đoạn code matlab:
g = 0.5;
img_wave_rev_quantized = sign(img_wave_dec).*(abs(img_wave_dec)+
g) .*d;

e. Thực hiện biến đổi ngược thành phần
-

Thực hiện inverse DWT
img_reconstructed =
func_InvDWT(img_wave_rev_quantized,S,Lo_R,Hi_R,level);
img_reconstructed = uint8(img_reconstructed);

f. Thực hiện xử lý sau biến đổi để được ảnh đầu ra:
sum = 0;
for i=1:size_row
for j=1:size_col
sum = sum + (double(img_reconstructed(i,j)-img(i,j)))^2;
end;
end;

g. Đo lường các thông số sau biến đổi
- Ta thực hiện tính MSE và PSNR như công thức đã đưa ở trên với đoạn code:
im = imread('lena256.bmp');
im=im2double(im);
im1= imread('lena256.jp2');
im1= im2double((im1));
D=abs(double(im) - double(im1)).^2;
mse=sum(D(:))/numel(im);
PSNR=10*log10((255*255)/mse);
disp(mse);
disp(PSNR);

3.

Tiến hành thử nghiệm

-

Ảnh gốc


-

Thực hiện biến đổi với filter db4


4.

-

Thực hiện biến đổi với filter db8

-

Thực hiện biến đổi với filter db10

Đánh giá, nhận xét


Phép biến đổi Wavelet không chia khối như phép biến đổi DCT mà là phép biến
đổi mã hóa băng con nên các thành phần sẽ được chia thành các băng tần số khác nhau và
mỗi băng sẽ được mã hóa riêng rẽ như vậy ảnh sẽ được nén với tỉ số cao mà không làm
giảm nhiều chất lượng ảnh. DWT còn cung cấp thông tin phổ tần số của tín hiệu và cho
biết thành phần này xuất hiện khi nào.

5.

TÀI LIỆU THAM KHẢO
-

-

-

Slide bài giảng xử lý dữ liệu đa phương tiện – PGS.TS Nguyễn Thị Hoàng Lan
MathWorks:
o http://www.mathworks.com/help/wavelet/ref/dwt2.html
o http://www.mathworks.com/help/wavelet/ref/dwt.html
J. M. Shapiro, "Embedded image coding using zerotrees of wavelet coefficients,
IEEE Transactions on Signal Processing, Vol. 41, No. 12, 1993, pp. 3445-3462.
Cohen-Daubechies-Feauveau wavelet: https://en.wikipedia.org/wiki/CohenDaubechies-Feauveau_wavelet
EZW (Embedded Zerotree Wavelet):
http://www.mathworks.com/matlabcentral/fileexchange/19296-ezw--embeddedzerotree-wavelethttp://www.mathworks.com/help/wavelet/ref/dwt2.html



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay

×