Hình 4.3: Lưu đồ giải thuật cho quá trình phân tích 4.1.4 Lưu đồ giải thuật cho quá trình IDWT
27
4.2 GIAO DIỆN CHO QUÁ TRÌNH MÔ PHỎNG
Hình 4.5: Vùng hiển thị cho các hình ảnh
28
Chương trình chạy cho giao diện
% PHẦN CHƯƠNG TRÌNH MẶC ĐỊNH CHO NỘI DUNG GIAO DIỆN function varargout = denoise(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @denoise_OpeningFcn, ... 'gui_OutputFcn', @denoise_OutputFcn, ... 'gui_LayoutFcn', [] , ...
'gui_Callback', []); if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1}); end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else
gui_mainfcn(gui_State, varargin{:}); end
% --- Executes just before denoise is made visible.
function denoise_OpeningFcn(hObject, eventdata, handles, varargin) handles.output = hObject;
guidata(hObject, handles);
% --- Outputs from this function are returned to the command line. function varargout = denoise_OutputFcn(hObject, eventdata, handles) varargout{1} = handles.output;
% CHƯƠNG TRÌNH CHO CÁC CÔNG CỤ VÀ HIỂN THỊ % Chương trình cho slider Mức phân tích.
function mucphantich_Callback(hObject, eventdata, handles) global lev_dec
lev_dec=get(handles.mucphantich,'value'); % Lấy giá trị từ slider.
lev_dec=round(lev_dec); % Làm tròn mức phân tích.
set(handles.hienthi_mucphantich,'str',num2str(lev_dec)); % Hiển thị mức phân tích. % Mặc định khởi chạy cho slider Mức phân tích bằng 2.
29 function mucphantich_CreateFcn(hObject, eventdata, handles)
global lev_dec lev_dec=2; if isequal(get(hObject,'BackgroundColor'),… get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor',[.9 .9 .9]); end
% Chương trình cho pushbutton Lọc nhiễu.
function locnhieu_Callback(hObject, eventdata, handles) global I J lev_dec sorh thrd ID wname twave mse psnr
twave=get(handles.ho_wavelet,'value'); % Lấy giá trị từ popupmenu Họ wavelet. switch (twave)
case 1
wname='db8'; % Họ wavelet Daubechies.
case 2
wname='sym6'; % Họ wavelet Symlets.
case 3
wname='coif5'; % Họ wavelet Coiflet.
case 4
wname='bior3.9'; % Họ wavelet Biorthogonal.
end
thrd=get(handles.nguong,'value'); % Lấy giá trị từ popupmenu Loại ngưỡng. switch (thrd) case 1 sorh='s'; % Ngưỡng mềm. case 2 sorh='h'; % Ngưỡng cứng. end
if length(size(J))==3 % Chương trình cho ảnh màu.
J1=J(:,:,1); % Trích ra ma trận 1 trong ma trận 3 chiều.
J2=J(:,:,2); % Trích ra ma trận 2 trong ma trận 3 chiều.
J3=J(:,:,3); % Trích ra ma trận 3 trong ma trận 3 chiều.
[c1,s1]=wavedec2(J1,lev_dec,wname); % Phân tích wavelet cho ma trận 1. det1=detcoef2('c',c1,s1,1); % Trích ra hệ số chi tiết mức 1 của ma trận 1. [c2,s2]=wavedec2(J2,lev_dec,wname); % Phân tích wavelet cho ma trận 2.
30 det2=detcoef2('c',c2,s2,1); % Trích ra hệ số chi tiết mức 1 của ma trận 2.
[c3,s3]=wavedec2(J3,lev_dec,wname); % Phân tích wavelet cho ma trận 3. det3=detcoef2('c',c3,s3,1); % Trích ra hệ số chi tiết mức 1 của ma trận 3. sigma1=median(abs(det1))/0.6745; % Ước lượng nhiễu cho ma trận 1. sigma2=median(abs(det2))/0.6745; % Ước lượng nhiễu cho ma trận 1. sigma3=median(abs(det3))/0.6745; % Ước lượng nhiễu cho ma trận 1.
alfa=2; % Tham số điều chỉnh mặc định cho khử nhiễu là 2.
thr1=wbmpen(c1,s1,sigma1,alfa); % Tính giá trị ngưỡng cho ma trận 1. thr2=wbmpen(c2,s2,sigma2,alfa); % Tính giá trị ngưỡng cho ma trận 2. thr3=wbmpen(c3,s3,sigma3,alfa); % Tính giá trị ngưỡng cho ma trận 3.
keepapp = 1; % Hệ số mặc định cho các xấp xỉ không được đặt ngưỡng.
ID1=wdencmp('gbl',c1,s1,wname,lev_dec,thr1,sorh,keepapp); % Lọc nhiễu bằng ID2=wdencmp('gbl',c2,s2,wname,lev_dec,thr2,sorh,keepapp); % đặt ngưỡng ID3=wdencmp('gbl',c3,s3,wname,lev_dec,thr3,sorh,keepapp); % toàn cục.
X=[ID1 ID2 ID3]; % Tái xây dựng lại ảnh màu
ID=reshape(X,size(J)); % từ cấu trúc đã phân tích.
mse=sum((I(:)-ID(:)).^2)/(3*prod(size(I))); % Tính sai số trung bình bình phương. set(handles.hienthi_mse,'str',num2str(mse)); % Hiển thị giá trị MSE.
psnr=10*log10(1/mse); % Tính giá trị tỉ số tín hiệu cực đại trên nhiễu.
set(handles.hienthi_psnr,'str',num2str(psnr)); % Hiển thị giá trị PSNR.
axes(handles.anhlocnhieu); % Hiển thị ảnh
imshow(ID); % sau lọc nhiễu lên axes Ảnh lọc nhiễu.
else % Chương trình cho ảnh mức xám.
[c,s]=wavedec2(J,lev_dec,wname); % Phân tích wavelet cho ma trận ảnh.
det1=detcoef2('c',c,s,1); % Trích ra hệ số chi tiết mức 1 của ma trận ảnh. sigma=median(abs (det1))/0.6745; % Ước lượng nhiễu.
alfa=2;
thr= wbmpen(c,s,sigma,alfa); % Tính giá trị ngưỡng. keepapp=1;
ID=wdencmp('gbl',c,s,wname,lev_dec,thr,sorh,keepapp); % Lọc nhiễu từ ngưỡng. mse=sum((I(:)-ID(:)).^2)/prod(size(I)); % Tính giá trị MSE.
set(handles.hienthi_mse,'str',num2str(mse)); % Hiển thị giá trị MSE.
psnr=10*log10(1/mse); % Tính giá trị PSNR.
31
axes(handles.anhlocnhieu); % Hiển thị ảnh
imshow(ID); % sau lọc nhiễu lên axes Ảnh lọc nhiễu.
end
% Chương trình cho slider Mức độ nhiễu.
function mucdonhieu_Callback(hObject, eventdata, handles) global lev_noise
lev_noise=get(handles.mucdonhieu,'value'); % Lấy giá trị từ slider Mức độ nhiễu. set(handles.hienthi_mucdonhieu,'str',num2str(lev_noise)); % Hiển thị mức độ nhiễu. % Mặc định khởi chạy cho slider Mức độ nhiễu bằng 0.02.
function mucdonhieu_CreateFcn(hObject, eventdata, handles) global lev_noise lev_noise=0.02; if isequal(get(hObject,'BackgroundColor'),… get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor',[.9 .9 .9]); end
% Chương trình cho pushbutton Tạo nhiễu.
function taonhieu_Callback(hObject, eventdata, handles) global I J lev_noise tnoise
tnoise=get(handles.loainhieu,'value'); % Lấy giá trị từ popupmenu Loại nhiễu. switch (tnoise)
case 1
J=imnoise(I,'gaussian',0,lev_noise); % Nhiễu Gaussian. case 2
J=imnoise(I,'speckle',lev_noise); % Nhiễu Speckle. case 3
J=imnoise(I,'salt & pepper',lev_noise); % Nhiễu Salt & Pepper. end
axes(handles.anhnhieu); % Hiển thị ảnh được tạo nhiễu
imshow(J); % lên axes Ảnh nhiễu.
% Chương trình cho pushbutton Tải ảnh.
function taianh_Callback(hObject, eventdata, handles) global I v
[fname,pname]=uigetfile({'*.jpeg;*.jpg;*.tif;*.tiff;*.bmp;*.png',... 'All supported image files';'*.jpg;*.jpeg','JPEG Files(*.jpg,*.jpeg)';...
32 '*.tif;*.tiff','TIFF Files(*.tif,*.tiff)';...
'*.bmp','Bitmap Files(*.bmp)';'*.png','PNG Files(*.png)'},'Load image to process'); v=strcat(pname,fname);
I=imread(v); I=im2double(I); axes(handles.anhgoc); imshow(I);
% Chương trình cho pushbutton Tải lại.
function tailai_Callback(hObject, eventdata, handles)
cla(handles.anhgoc,'reset'); % Xóa ảnh trên axes Ảnh gốc.
cla(handles.anhnhieu,'reset'); % Xóa ảnh trên axes Ảnh nhiễu. cla(handles.anhlocnhieu,'reset'); % Xóa ảnh trên axes Ảnh lọc nhiễu.
clear global; % Xóa tất cả giá trị các biến.
global lev_noise lev_dec % Khai báo lại cho các mặc định.
set(handles.hienthi_mucdonhieu,'str',num2str(0.02)); % Thiết lập lại
set(handles.hienthi_mucphantich,'str',num2str(2)); % tất cả giá trị mặc định
set(handles.mucdonhieu,'value',0.02); % mức độ nhiễu, loại nhiễu
set(handles.mucphantich,'value',2); % mức phân tích, họ wavelet
set(handles.ho_wavelet,'value',1); % loại ngưỡng và hiển thị lại
set(handles.nguong,'value',1); % các giá trị mặc định cho tiến
set(handles.loainhieu,'value',1); % trình xử lý mới.
set(handles.hienthi_mse,'str',num2str(0)); % Thiết lập hiển thị MSE về 0. set(handles.hienthi_psnr,'str',num2str(0)); % Thiết lập hiển thị PSNR về 0. lev_noise=0.02; % Gán lại giá trị mặc định cho mức độ nhiễu.
lev_dec=2; % Gán lại giá trị mặc định cho mức phân tích.
% Chương trình cho pushbutton Lưu ảnh.
function luuanh_Callback(hObject, eventdata, handles) global ID
[fname,pname]=uiputfile('*.jpg','Save image'); name=fullfile(pname,fname);
imwrite(ID,name,'jpg');
% Chương trình cho pushbutton Thoát.
function thoat_Callback(hObject, eventdata, handles) close all;
33 % --- Executes on selection change in nguong.
function nguong_Callback(hObject, eventdata, handles)
% --- Executes during object creation, after setting all properties. function nguong_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'),… get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white'); end
% --- Executes during object creation, after setting all properties. function hienthi_mucdonhieu_CreateFcn(hObject, eventdata, handles) % --- Executes during object creation, after setting all properties. function hienthi_mucphantich_CreateFcn(hObject, eventdata, handles) % --- Executes during object creation, after setting all properties. function anhgoc_CreateFcn(hObject, eventdata, handles)
% --- Executes during object creation, after setting all properties. function anhnhieu_CreateFcn(hObject, eventdata, handles) % --- Executes during object creation, after setting all properties. function anhlocnhieu_CreateFcn(hObject, eventdata, handles) % --- Executes on selection change in ho_wavelet.
function ho_wavelet_Callback(hObject, eventdata, handles) % --- Executes during object creation, after setting all properties. function ho_wavelet_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'),… get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white'); end
% --- Executes on selection change in loainhieu.
function loainhieu_Callback(hObject, eventdata, handles)
% --- Executes during object creation, after setting all properties. function loainhieu_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'),… get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white'); end
34 function hienthi_mse_CreateFcn(hObject, eventdata, handles)
% --- Executes during object creation, after setting all properties. function hienthi_psnr_CreateFcn(hObject, eventdata, handles) % --- Executes during object creation, after setting all properties. function logo_CreateFcn(hObject, eventdata, handles)
lg=imread('stu.bmp'); imshow(lg);
Giao diện cho quá trình xử lý ảnh gồm các vùng sau
- Vùng tải ảnh, lưu ảnh, reset và thoát khỏi windows.
- Vùng mô phỏng sinh nhiễu cho ảnh với các loại nhiễu Gaussian, Speckle, Salt & Pepper và với các mức độ nhiễu từ 0 đến 1 được cài đặt trên thanh trượt. Giá trị cài đặt mặc định chạy trên giao diện là loại nhiễu Gaussian với mức độ nhiễu là 0.02.
- Vùng lọc nhiễu cho ảnh có các lựa chọn mức phân tích wavelet, họ hàm wavelet và loại ngưỡng cứng hay mềm. Các họ hàm wavelet ở đây có thể phân tích cho kết quả tốt được lựa chọn cho giao diện từ thực nghiệm là Daubechies, Symlets, Coiflets và Biorthogonal. Giá trị cài đặt mặc định chạy trên giao diện là mức phân tích level 2, họ hàm wavelet Daubechies và loại ngưỡng là ngưỡng mềm.
- Vùng hiển thị ảnh bao gồm 3 đồ thị hiển thị cho ảnh gốc, ảnh nhiễu và ảnh sau khi được lọc nhiễu.
- Ngoài ra còn có hiển thị giá trị sai số trung bình bình phương và tỉ số tín hiệu cực đại trên nhiễu để có thể biết được chất lượng hình ảnh sau khử nhiễu qua đó có thể điều chỉnh họ hàm wavelet, mức phân tích và loại ngưỡng để có được một kết quả tốt nhất.
4.3 KẾT QUẢ VÀ KẾT LUẬN
4.3.1 Kết quả trên ảnh mức xám
35 Hình 4.8: Ảnh được lọc nhiễu với hàm wavelet Biorthogonal
Hình 4.9: Ảnh được lọc nhiễu với hàm wavelet Coiflets
Kết quả giá trị MSE và PSNR của ảnh mức xám có số pixel 1024 × 1024, dùng hàm sinh nhiễu Gaussian mức độ nhiễu 0.02, thực hiện cho các mức phân tích từ 2 đến 7 dùng loại ngưỡng mềm thu được ở Bảng 4.1 và Bảng 4.2.
Bảng 4.1: Kết quả giá trị MSE và PSNR thu được trên ảnh mức xám
Mức Wavelet
2 3 4
MSE PSNR MSE PSNR MSE PSNR
Daubechies 0.0014168 28.4869 0.0011549 29.3746 0.0015211 28.1785 Symlets 0.0014301 28.4463 0.0011408 29.4278 0.0014605 28.3550 Coiflets 0.0014052 28.5226 0.0011011 29.5815 0.0014174 28.4852 Biorthogonal 0.0014333 28.4366 0.0010976 29.5957 0.0013917 28.5645
36 Bảng 4.2: Kết quả giá trị MSE và PSNR thu được trên ảnh mức xám (tiếp theo)
4.3.2 Kết quả trên ảnh RGB
Hình 4.10: Ảnh được lọc nhiễu với hàm wavelet Coiflets
Hình 4.11: Ảnh được lọc nhiễu với hàm wavelet Symlets
Mức Wavelet
5 6 7
MSE PSNR MSE PSNR MSE PSNR
Daubechies 0.0018077 27.4286 0.0019273 27.1504 0.0019665 27.0631 Symlets 0.0017218 27.6403 0.0018365 27.3601 0.0018775 27.2688 Coiflets 0.0016539 27.8149 0.0017427 27.5767 0.0017763 27.5049 Biorthogonal 0.0015978 27.9648 0.0016934 27.7124 0.0017260 27.6297
37 Hình 4.12: Ảnh được lọc nhiễu với hàm wavelet Biorthogonal
Kết quả giá trị MSE và PSNR của ảnh mức RGB có số pixel 1024 × 1024, dùng hàm sinh nhiễu Gaussian mức độ nhiễu 0.02, thực hiện cho các mức phân tích từ 2 đến 7 dùng loại ngưỡng mềm thu được ở Bảng 4.3 và Bảng 4.4.
Bảng 4.3: Kết quả giá trị MSE và PSNR thu được trên ảnh RGB
Bảng 4.4: Kết quả giá trị MSE và PSNR thu được trên ảnh RGB (tiếp theo)
4.3.3 Kết luận kết quả lọc nhiễu
- Từ kết quả thực nghiệm trên giao diện đồ họa đối với ảnh có số điểm ảnh 1024 × 1024 cho thấy tỉ số tín hiệu cực đại trên nhiễu đạt giá trị cao nhất tại mức 3 trong quá trình thực hiện phân tích và khử nhiễu từ mức 2 đến mức 7.
Mức Wavelet
2 3 4
MSE PSNR MSE PSNR MSE PSNR
Daubechies 0.0006119 32.1331 0.0005519 32.5812 0.0006733 31.7178 Symlets 0.0006153 32.1091 0.0005496 32.5994 0.0006537 31.8463 Coiflets 0.0006092 32.1524 0.0005429 32.6524 0.0006479 31.8848 Biorthogonal 0.0006114 32.1366 0.0005338 32.7264 0.0006239 32.0488 Mức Wavelet 5 6 7
MSE PSNR MSE PSNR MSE PSNR
Daubechies 0.0007711 31.1291 0.0008204 30.8599 0.0008438 30.7375 Symlets 0.0007419 31.2966 0.0007902 31.0229 0.0008126 30.9005 Coiflets 0.0007350 31.3371 0.0007769 31.0963 0.0007955 30.9936 Biorthogonal 0.0007040 31.5240 0.0007475 31.2635 0.0007672 31.1511
38 - Như đã đề cập ở phần khử nhiễu dùng ngưỡng, nếu phân tích wavelet mức cao cùng với việc đặt ngưỡng sẽ làm cho tín hiệu tái tạo lại có quá nhiều giá trị 0 dẫn đến thông tin chính không còn chính xác.
- Nếu mức độ nhiễu ảnh quá cao thì kết quả sau khi lọc nhiễu sẽ khó có thể khôi phục lại các chi tiết nhỏ của ảnh nhưng vẫn có ích đối với mục đích lọc nhiễu ảnh để thấy được tổng quát hình dạng cơ bản trong ảnh.
- Đối với một số hàm wavelet nếu lọc nhiễu tốt ở mức thấp thì không lọc nhiễu tốt ở mức cao và ngược lại nếu lọc nhiễu tốt ở mức thấp thì không lọc nhiễu được tốt ở mức cao.
39
CHƯƠNG 5
KẾT LUẬN VÀ ĐỀ NGHỊ
5.1 KẾT LUẬN
Kết quả đạt được trong đề tài
- Cơ bản đáp ứng được mục tiêu đặt ra là ứng dụng DWT – biến đổi wavelet rời rạc lọc nhiễu được cho tín hiệu hình ảnh.
- Tìm hiểu biến đổi wavelet và ứng dụng trong khử nhiễu.
- Xây dựng được chương trình khử nhiễu chạy trên giao diện GUI của Matlab cho quá trình mô phỏng.
- Xử lý được trên ảnh mức xám và ảnh RGB.
Những hạn chế
- Trong quá trình khử nhiễu đối với ảnh RGB, kết quả khử nhiễu có thể chỉ mang tính tương đối vì xử lý trên 3 ma trận có thể gây ra sai số.
- Khi phân tích ảnh bằng wavelet ở một mức phân tích cao sẽ khó khăn cho việc đặt ngưỡng khử nhiễu vì phân tích wavelet mức cao sẽ tạo ra quá nhiều các hệ số chi tiết và xấp xỉ nên trong luận văn chỉ sử dụng phương pháp đặt ngưỡng toàn cục.
5.2 ĐỀ NGHỊ
- Có thể khử nhiễu bằng biến đổi wavelet kết hợp với phương pháp khử nhiễu bằng các bộ lọc để có kết quả tốt hơn.
Hướng phát triển của đề tài
- Có thể nghiên cứu phát triển cho các loại ảnh chụp vệ tinh, ảnh viễn thám, ảnh y sinh,…
- Khử nhiễu kết hợp với phương pháp nén ảnh bằng wavelet và bảo mật thông tin trong truyền thông tin.
40
TÀI LIỆU THAM KHẢO
- Nguyễn Hoàng Hải – Nguyễn Việt Anh – Phạm Minh Toàn – Hà Trần Đức, Công
cụ phân tích wavelet và ứng dụng trong Matlab, nhà xuất bản Khoa học và Kỹ thuật Hà
Nội, năm 2005.
- Hoàng Xuân Dương, Bài giảng Tin học chuyên ngành Matlab lý thuyết và ứng dụng.
- Burhan Ergen, Signal and Image Denoising Using Wavelet Transform, Firat
University Turkey.
- Prof. Dr. Ir. M. Steinbuch – Dr. Ir. M.J.G. van de Molengraft, Wavelet Theory and Applications, Eindhoven University of Technology Department of Mechanical Engineering
– Control Systems Technology Group, Eindhoven, June 7, 2005. - www.mathworks.com