Tải bản đầy đủ (.pdf) (9 trang)

imagescompressionusinghuffmanalgorithmmatlab 140225113447 phpapp01

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (686.1 KB, 9 trang )

NÉN & GIẢI NÉN
ẢNH BẰNG THUẬT
TOÁN HUFFMAN
1/14/14

Bài tập lớn Xử lý ảnh


Đề tài 4:

Viết chương trình nén/giải nén ảnh không tổn hao dựa trên giải thuật
Huffman. Lấy ví dụ với nhiều ảnh khác nhau (ảnh ít chi tiết và ảnh nhiều chi tiết). Xác
định tỉ số nén của các ảnh ví dụ trên.
Bài làm:
Viết hai hàm m-function để mã hóa và giải mã Huffman: im2huff và huff2im
function y = im2huff(x)
%IM2HUFF Huffman encodes a image matrix.
%
Y = IM2HUFF(X) Huffman encodes image matrix X using symbol
%
probabilities in unit-width histogram bins.
%
Y:
%
Y.size
The size of X
%
Y.gray
The gray levels contain in X
%
Y.hist


The histogram of X
%
Y.codlen
The Huffman code length
%
Y.code
The Huffman-encoded values of X, stored in
%
a uint16 vector.
%
%
Check input argument
if ndims(x) ~= 2 || ~isreal(x) || (~isnumeric(x)&& ~islogical(x))
error('X must be a 2-D real numeric or logical matrix.');
end
% Store the image dimesion for decopressing
y.size = size(x);
% Compute the probabilities of each gray level
[p,gray]=imhist(x);
% Get rid of the gray levels whose probabilities is zero
indices = find(p);
y.gray = gray(indices);
p = p(indices);
% Normalize the gray level probability
p = p/sum(p);
y.hist = p;
% Construct Huffman codeword using available MATLAB m-function
dict = huffmandict(y.gray,y.hist);
% Reshape image matrix to image vector and encode it
hcode = huffmanenco(reshape(x,1,(y.size(1))*(y.size(2))),dict);

y.codlen = length(hcode);
% Huffman code length
ysize = ceil(y.codlen/16);
% Compute encode size
hx16 = zeros(1, ysize*16);
% Pre-allocate modulo-16 vector
hx16(1:y.codlen) = hcode;
% Make hx modulo-16 in length
hx16 = reshape(hx16, 16, ysize);
% Reshape to 16-character words
hx16 = hx16';
% Convert binary string to decimal
twos = pow2(15:-1:0);
y.code = (uint16(hx16*twos'));
end

Hàm im2huff sử dụng m-function có sẵn của MATLAB huffmandict để tạo bảng từ mã
và hàm huffmanenco để mã hóa chuỗi dữ liệu vào. Nội dung của 2 function này có thể
tham khảo trong communications system toolbox MATLAB. Trả về của hàm im2huff
là một biến kiểu structure gồm các trường


NÉN & GIẢI NÉN ẢNH BẰNG THUẬT TOÁN HUFFMAN








size: chứa kích thước ma trận ảnh cần mã hóa
gray: chứa các giá trị thang xám trong ảnh
hist: histogram của ảnh
codlen: chiều dài chuỗi mã hóa của ảnh
code: chuỗi mã hóa Huffman của ảnh được lưu dưới dạng uinteger16

Hai trường gray và hist được truyền đi giúp cho bên nhận có cơ sở xây dựng lại bảng từ
mã. Để lưu trữ chuỗi mã hóa Huffman (gồm các bits ‘0’ và ‘1’) với kích thước bé ta chia
chuỗi này thành các mảng 16 phần tử và có thêm các bits ‘0’ làm padding. Để bỏ các bits
padding này khi giải mã, cách đơn giản nhất và cũng để tận dụng hàm huffmandeco có
sẵn của MATLAB là ta truyền thêm giá trị codlen (code length).
function x = huff2im(y)
%
HUFF2MAT decodes a Huffman encoded matrix.
%
X = HUFF2MAT(Y) decodes a Huffman encoded structure Y with uint16
%
fields:
%
Y:
%
Y.size
The size of original image
%
Y.gray
The gray levels contain in original image
%
Y.hist
The histogram of image
%

Y.codlen
The Huffman code length
%
Y.code
The Huffman-encoded values, stored in
%
a uint16 vector.
%
if ~isstruct(y) || ~isfield(y, 'size') || ~isfield(y, 'gray') || ...
~isfield(y, 'hist')|| ~isfield(y, 'codlen')|| ~isfield(y,
'code')
error('The input must be a sructure as returned by IM2HUFF.');
end
% Convert decimal array to binary array for decoding process
hcode = de2bi(y.code,16,'left-msb');
hcode = hcode';
hcode = reshape(hcode,1,[]);
hcode = hcode(1:y.codlen);
hcode = double(hcode);
% Reconstruct Huffman codewords database
dict = huffmandict(y.gray,y.hist);
% Decode the hcode using huffmandeco MATLAB function
dhsig = huffmandeco(hcode,dict);
x = reshape(dhsig,y.size(1),y.size(2));
x = uint8(x);
end

Ở phía thu ta xây dựng lại bảng từ mã từ hai trường gray và hist; chuyển code thu được
từ dạng mảng thập phân sang mảng nhị phân và loại bỏ các bits padding. Dùng hàm
huffmandeco để giải mã chuỗi huffman.


PAGE 1

40901817-40902371-40903123


NÉN & GIẢI NÉN ẢNH BẰNG THUẬT TOÁN HUFFMAN

Thực hiện nén và giải nén với các ảnh:
1. Nén và giải nén với ảnh thang xám có ít chi tiết (chênh lệch xác suất mức thang
xám lớn)

4500
4000
3500
3000
2500
2000
1500
1000
500
0
0

50

100

150


200

250

PAGE 2

40901817-40902371-40903123


NÉN & GIẢI NÉN ẢNH BẰNG THUẬT TOÁN HUFFMAN

Hàm imratio (tham khảo Digital image processing using MATLAB Gonzalez) được sử
dụng để tính tỷ số nén ảnh.
Giải mã Huffman và tính rmse (root mean square error) để kiểm tra tính không tổn hao
của thuật toán. M-functon compare (tham khảo Digital image processing using
MATLAB Gonzalez) trả về giá trị rmse của hai ảnh.

PAGE 3

40901817-40902371-40903123


NÉN & GIẢI NÉN ẢNH BẰNG THUẬT TOÁN HUFFMAN

16000
14000
12000
10000
8000
6000

4000
2000
0
0

50

100

150

200

250

PAGE 4

40901817-40902371-40903123


NÉN & GIẢI NÉN ẢNH BẰNG THUẬT TOÁN HUFFMAN

Nhận xét: Do thuật toán thực hiện với điểm ảnh, độ phức tạp càng tăng khi kích thước
ảnh càng lớn O(nlogn).
2. Nén và giải nén với ảnh thang xám có nhiều chi tiết.

PAGE 5

40901817-40902371-40903123



NÉN & GIẢI NÉN ẢNH BẰNG THUẬT TOÁN HUFFMAN

3000

2500

2000

1500

1000

500

0
0

50

100

150

200

250

PAGE 6


40901817-40902371-40903123


NÉN & GIẢI NÉN ẢNH BẰNG THUẬT TOÁN HUFFMAN

Nhận xét: Với ảnh có nhiều chi tiết nén Huffman không có hiệu quả.

PAGE 7

40901817-40902371-40903123



×