MATLAB ỨNG DỤNG TRONG VIỄN THÔNG - Trang 225

Nén ảnh số

204

>> im = dctcompr (infile,coeff,outfile)

infile

,

outfile

là tên các file ảnh gốc và ảnh sau khi nén,

coeff

là số các hệ số DCT

được giữ lại trong toàn bộ ảnh.
Ví dụ dưới đây giới thiệu một đoạn chương trình ngắn khác để thực hiện nén ảnh theo DCT.
Trong ví dụ này, chúng ta sử dụng hàm dctmtx để tạo ra ma trận biến đổi DCT kích thước
NxN (cụ thể N = 8):

>> D = dctmtx(N)

Từ đó có thể tính các hệ số DCT của ảnh A (với A là ma trận vuông) bằng công thức
D*.A.D’. Cách tính này cho kết quả nhanh hơn so với hàm DCT, đặc biệt là khi ta chia ảnh
thành nhiều khối nhỏ vì khi đó chỉ cần tính ma trận D một lần. Để chia ảnh thành các khối con
và xử lý từng khối, ta có thể dùng hàm blkproc:

>> B = blkproc(A,[M N],fun)

Hàm này xử lý ảnh đầu vào

A

bằng cách chia

A

thành các khối

MxN

và áp dụng hàm

fun

cho

mỗi khối.
Ví dụ 13-2. Thực hiện giải thuật nén ảnh dựa trên DCT bằng cách chỉ giữ lại 10 hệ số
DCT đầu tiên trong tổng số 64 hệ số DCT:

I = imread('cameraman.tif'); % Đọc ảnh cameraman.tif

I = im2double(I);

% Chuyển sang kiểu double

T = dctmtx(8);

% Tính ma trận biến đổi DCT 8x8

B = blkproc(I,[8 8],'P1*x*P2',T,T');% Thực hiện phép nhân T*X*T’với mỗi

khối

mask = [1 1 1 1 0 0 0 0

% Mặt nạ, dùng để giữ lại chỉ 10 hệ số DCT

1 1 1 0 0 0 0 0

1 1 0 0 0 0 0 0

1 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0];

B2 = blkproc(B,[8 8],'P1.*x',mask); % Lượng tử hoá các hệ số DCT

I2 = blkproc(B2,[8 8],'P1*x*P2',T',T);% Giải mã

imshow(I), figure, imshow(I2) % Hiển thị các ảnh