Matlab là một ngôn ngữ lập trình thực hành bậc cao được sử dụng để giải các bài toán về kỹ thuật. Matlab tích hợp được việc tính toán, thể hiện kết quả, cho phép lập trình, giao diện làm việc rất dễ dàng cho người sử dụng. Dữ liệu cùng với thư viện được lập trình sẵn cho phép người sử dụng có thể có được những ứng dụng sau đây.
• Sử dụng các hàm có sẵn trong thư viện, các phép tính toán học thông thường.
• Cho phép lập trình tạo ra những ứng dụng mới.
• Cho phép mô phỏng các mô hình thực tế.
• Phân tích, khảo sát và hiển thị dữ liệu.
• Với phần mềm đồ hoạ cực mạnh.
• Cho phép phát triển, giao tiếp với một số phần mềm khác như C++, Fortran.
10 trang |
Chia sẻ: tuandn | Lượt xem: 7361 | Lượt tải: 1
Bạn đang xem nội dung tài liệu Đề tài Sử dụng phần mềm Matlab trong xử lý nén ảnh số, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
Chương 3
CHƯƠNG TRÌNH NÉN ẢNH
3.1 Giao diện chương trình
Hình 3.1 Giao diện chương trình
3.2 Mô hình nén
3.3 Quá trình nén và giải nén DCT
Khi chọn ảnh gốc đưa vào nén DCT, trước khi nén ta kiểm tra ảnh đó có phải là ảnh xám không. Nếu không phải thì chuyển nó về dạng ảnh xám sau đó thực hiện các bước nén ảnh như sau:
B1: Chuyển dữ liệu ảnh sang kiểu “double”.
B2: Chia ảnh gốc ra thành nhiều khối (ảnh con) kích thước 8x8.
B3: Biến đổi thuận DCT đối với mỗi khối ảnh 8x8. Ta có thể tạo ma trận biến đổi DCT A kích thước NxN bằng hàm: A=dctmtx(N).
Ví dụ: A=dctmtx(8) ( Ma trận biến đổi DCT A có giá trị:
0.3536
0.3536
0.3536
0.3536
0.3536
0.3536
0.3536
0.3536
0.4904
0.4157
0.2778
0.0975
-0.098
-0.278
-0.416
-0.49
0.4619
0.1913
-0.191
-0.462
-0.462
-0.191
0.1913
0.4619
0.4157
-0.098
-0.49
-0.278
0.2778
0.4904
0.0975
-0.416
0.3536
-0.354
-0.354
0.3536
0.3536
-0.354
-0.354
0.3536
0.2778
-0.49
0.0975
0.4157
-0.416
-0.098
0.4904
-0.278
0.1913
-0.462
0.4619
-0.191
-0.191
0.4619
-0.462
0.1913
0.0975
-0.278
0.4157
-0.49
0.4904
-0.416
0.2778
-0.098
B4: Lượng tử hóa các hệ số DCT.
Thực hiện lượng tử hóa bằng cách nhân các khối ảnh 8x8 đã biến đổi DCT với bảng lượng tử hóa, ở đây nó là một mặt nạ (mask) ma trận 8x8. Mục đích của bước này là nhằm chỉ giữ lại những phần tử mang năng lượng của khối ảnh hay nói chính xác đó là 10 phần tử đầu tiên của khối ảnh 8x8.
Mặt nạ (mask) ma trận 8x8 giữ lại 10 phần tử:
1
1
1
1
0
0
0
0
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
B5: Giải mã cho ra ảnh (nén + giải nén DCT).
Ví dụ: Thực hiện nén và giải nén DCT đối với ảnh “Cameraman.tif”.
B1 Chuyển dữ liệu ảnh sang kiểu “double”.
I = imread('cameraman.tif');
I = im2double(I);
B2: Chia ảnh gốc ra thành nhiều khối (ảnh con) kích thước 8x8. Một khối ảnh 8x8 đã được chia có giá trị pixel:
0.6118
0.6235
0.6196
0.6078
0.6196
0.6118
0.6235
0.6196
0.6275
0.6039
0.6157
0.6196
0.6157
0.6235
0.6196
0.6196
0.6118
0.6235
0.6196
0.6078
0.6196
0.6118
0.6235
0.6196
0.6275
0.6039
0.6157
0.6196
0.6157
0.6235
0.6196
0.6196
0.6118
0.6
0.6078
0.6235
0.6235
0.6078
0.6118
0.6078
0.6078
0.6078
0.6078
0.6157
0.6118
0.6235
0.5961
0.6196
0.6118
0.6
0.6157
0.6118
0.6
0.6078
0.6039
0.6078
0.6235
0.6235
0.6118
0.6196
0.6118
0.6235
0.6157
0.6314
B3: Biến đổi DCT
4.9211
-0.008
0.0026
0.0018
0.0093
0.0041
0.0101
-0.002
0.015
-0.003
0.0021
0.0028
-0.008
0.0008
-0.009
0.0157
0.008
0.002
0.0132
-0.006
-0.009
-0.006
-0.002
-0.003
-0.02
0.0003
-0.012
-0.002
0.0036
-0.004
0.0021
-0.001
0.0132
-0.002
0.0013
0.0024
0.0034
0.0011
-0.008
0.0021
-0.008
0.0036
0.0044
-0.006
-0.01
0.0002
0.0015
0.0056
0.0078
-0.003
0.004
-0.005
-0.008
-0.021
-0.008
-0.003
-0.011
0.0039
-0.005
-0.008
-0.005
-0.002
-0.015
0.0123
B4: Lượng tử hóa
4.9211
-0.008
0.0026
0.0018
0
0
0
0
0.015
-0.003
0.0021
0
0
0
0
0
0.008
0.002
0
0
0
0
0
0
-0.02
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
B5: Giải mã
0.6158
0.6151
0.6146
0.6148
0.6158
0.617
0.6179
0.6183
0.6179
0.6174
0.6169
0.6172
0.6183
0.6195
0.6204
0.6208
0.6185
0.6181
0.6178
0.6182
0.6193
0.6206
0.6214
0.6218
0.6151
0.6148
0.6146
0.6152
0.6163
0.6175
0.6182
0.6184
0.6103
0.6101
0.61
0.6105
0.6116
0.6125
0.613
0.6131
0.609
0.6088
0.6087
0.6092
0.61
0.6106
0.6108
0.6108
0.6125
0.6123
0.6121
0.6125
0.6131
0.6134
0.6134
0.6131
0.6167
0.6165
0.6163
0.6166
0.617
0.6172
0.617
0.6166
Ảnh cuối cùng cho ra các thông số giá trị pixel như bảng trên và kết quả thu được hình như bên dưới.
b)
Hình 3.2 a) Ảnh gốc; b) Ảnh nén
3.4 Các đoạn mã lệnh
3.4.1 Chọn ảnh
function chonanh_Callback(hObject, eventdata, handles)
[filename,pathname]=uigetfile({'*.tif;*.bmp;*.gif;*.jpg'},'pick an image file');
S=imread([pathname,filename]);
axes(handles.anh1);
imshow(S);
guidata(hObject, handles);
3.4.2 Nén DCT
function nen_Callback(hObject, eventdata, handles)
S=handles.S;
axes(handles.anh2);
if size(S,3)==3
S=rgb2gray(S);
end
I = im2double(S);
T = dctmtx(8);
B = blkproc(I,[8 8],'P1*x*P2',T,T');
mask = [1 1 1 1 0 0 0 0
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);
I2 = blkproc(B2,[8 8],'P1*x*P2',T',T);
imshow(I2)
handles.I2=I2;
guidata(hObject, handles);
3.4.3 Xem Pixel ảnh gốc
function pixel_goc_Callback(hObject, eventdata, handles)
S=handles.S;
axes(handles.anh3);
if size(S,3)==3
S=rgb2gray(S);
end
I=im2double(S);
I1=imresize(I,[8 8]);
himage=imshow(I1);
hfigure=figure;
hpanel=impixelregionpanel(hfigure,himage);
3.4.4 Xem Pixel ảnh nén
function pixel_nendct_Callback(hObject, eventdata, handles)
S=handles.S;
axes(handles.anh4);
if size(S,3)==3
S=rgb2gray(S);
end
I=im2double(S);
I1=imresize(I,[8 8]);
T=dct2(I1);
himage=imshow(T);
hfigure=figure;
hpanel=impixelregionpanel(hfigure,himage);
3.4.5 Xem giá trị từng Pixel
function ketqua_Callback(hObject, eventdata, handles)
S=handles.S;
if size(S,3)==3
S=rgb2gray(S);
end
I=im2double(S);
A=imresize(I,[8 8]);
p=get(handles.hang,'string'); %gán p giá trị chuỗi trong handles.hang
q=get(handles.cot,'string'); %gán q giá trị chuỗi trong handles.cot
p=str2num(p); %chuyển từ giá trị chuỗi sang giá trị số
q=str2num(q);
p=round(p); %làm tròn giá trị số
q=round(q);
c=0;
p1=0;
q1=0;
goc=0;
if (p>0)&(q>0)
if (p<=8)&(q<=8)
for m=0:7
for n=0:7
B=A(m+1,n+1)*cos((pi*(2*m+1)*(p-1))/16)*cos((pi*(2*n+1)*(q-1))/16);
c=B+c;
end
end
p1=p;
q1=q;
goc=A(p1,q1);
end
end
if (p-1)==0
ap=sqrt(1/8);
else
ap=sqrt(2/8);
end
if (q-1)==0
aq=sqrt(1/8);
else
aq=sqrt(2/8);
end
ketqua=ap*aq*c;
h=num2str(ketqua); %chuyển từ giá trị số sang giá trị chuỗi
set(handles.ketqua,'string',h); %hiển thị giá trị của h lên handles.ketqua
goc=num2str(goc);
set(handles.goc,'string',goc);
3.5 Kết quả khi chạy chương trình
3.5.1 Chọn ảnh
3.5.2 Nén DCT
3.5.3 Pixel ảnh gốc
3.5.4 Pixel DCT
3.5.6 Kết quả