
Tạo nhiễu ảnh Noise trong Matlab
Trong bài viết này tôi và cũng cùng nhau tìm hiểu cách để chèn nhiểu ảnh vào một bức ảnh số. Từ đó bạn sẽ hiểu được đặc tính nhiễu của một bức ảnh là như thế nào? Từ đó bạn sẽ biết cách khắc phục cũng như nâng cáo chất lượng hình ảnh hay là ta sẽ biết được cách khử noise.

1. Các kiểu nhiễu trên ảnh
Có 5 kiểu nhiễu mà Matlab hỗ trợ bạn đó là: salt & pepper, gaussian, localvar, poisson, speckle. Bạn muốn sử dụng 1 trong 5 kiểu trên đây đều được cả.
2. Lệnh Thêm nhiễu vào bức ảnh
Thì từng loại kiểu nhiễu thì hàm imnoise sẽ có tham số truyền vào khác nhau
ketQuaHinhAnh = imnoise('anhXam', 'salt & pepper', 0.02); ketQuaHinhAnh = imnoise('anhXam', 'gaussian', 0.02); ketQuaHinhAnh = imnoise('anhXam', 'localvar', ones(size(anhXam)); ketQuaHinhAnh = imnoise('anhXam', 'poisson'); ketQuaHinhAnh = imnoise('anhXam', 'speckle', 0.02);
Trong đó:
- anhXam : Là ảnh xám được biến đổi từ ảnh màu bằng hàm rgb2gray(hinhAnh)
- 0.02 : Là cường độ nhiễu. Bạn muốn tăng giảm cường độ nhiều thì bạn có thể chỉnh số này tăng nên hoặc giảm đi
- ones(size(anhXam) : Đây là đầu vào phụ hỗ trợ cho localvar vì localvar không sử dụng cường độ nhiễu. Có kích thước bằng ảnh gốc của chúng ta.
- poisson : Sẽ không có tham số thứ 3 truyền vào. Trương trình sẽ tự hiểu loại nhiễu này và tự động thêm cường độ nhiễu vào.
- ketQuaHinhAnh : Là một hình ảnh mới đã sử lý và bạn hoàn toàn có thể hiện thị ảnh nên GUI cũng như có thể xuất bản hình ảnh (hàm imwrite()) này.
3. Bài tập áp dụng
Dưới đây là ví dụ cho chúng ta thực hành. Giao diện thì bạn hãy tự thiết kế vì nếu tôi hướng dẫn phần này nữa thì quả thực bài viết khá là dài và không đi đúng trọng tâm vấn đề ta đang hướng tới. Nếu bạn chưa biết hay chưa có kinh nghiệm tạo giao diện thì bạn hãy xem loạt bài viết mà tôi đã hướng dẫn lập trình GUI trước đây rồi.

Và dưới đây là code trương trình.
1. Mo Anh (Tag: pushbutton1)
global hinhAnh; [FileName,PathName] = uigetfile({'*.png;*.PNG','PNG Files (*.png, *.PNG)'; '*.tif;*.TIF','TIF Files (*.tif, *.TIF)';... '*.gif;*.GIF','GIF Files (*.gif, *.GIF)';... '*.jpg;*.JPG','JPG Files (*.jpg, *JPG)';... '*.bmp;*.BMP','BMP Files (*.bmp, *.BMP)';... '*.*','All Files(*.*)'},'Lua Chon Hinh Anh De Xu Ly'); if ~isequal(FileName,0) fullname = strcat(PathName,FileName); hinhAnh=imread(fullname); axes(handles.axes1); imshow(hinhAnh); else msgbox('Ban hay chon anh de thuc hien chuong trinh!') end
2. Kieu Nhieu (Tag: popupmenu1)
luachonnhieu = get(handles.popupmenu1,'value'); switch luachonnhieu case 3 set(handles.edit1, 'visible', 'off'); set(handles.text4, 'visible', 'off'); case 4 set(handles.edit1, 'visible', 'off'); set(handles.text4, 'visible', 'off'); otherwise set(handles.edit1, 'visible', 'on'); set(handles.text4, 'visible', 'on'); end
3. Chen Nhieu (Tag: chennhieu)
global hinhAnh; X = size(hinhAnh); if (length(X) == 3) anhGoc = rgb2gray(hinhAnh); else anhGoc = hinhAnh; end; luachonnhieu = get(handles.popupmenu1,'value'); cuongDoNhieu = get(handles.edit1,'string'); cuongDoNhieu = str2num(cuongDoNhieu); switch luachonnhieu case 1 anhNhieu = imnoise(hinhAnh,'salt & pepper',d); axes(handles.axes1); imshow(anhGoc); axes(handles.axes2); imshow(anhNhieu); case 2 anhNhieu = imnoise(hinhAnh,'gaussian',d); axes(handles.axes1); imshow(anhGoc); axes(handles.axes2); imshow(anhNhieu); case 3 anhNhieu = imnoise(hinhAnh,'localvar',ones(size(w))); axes(handles.axes1); imshow(anhGoc); axes(handles.axes2); imshow(anhNhieu); case 4 anhNhieu = imnoise(hinhAnh,'poisson'); axes(handles.axes1); imshow(anhGoc); axes(handles.axes2); imshow(anhNhieu); case 5 anhNhieu = imnoise(hinhAnh,'speckle',d); axes(handles.axes1); imshow(anhGoc); axes(handles.axes2); imshow(anhNhieu); end;
Những câu lệnh bên trên thì bạn đã được học trong các bài viết ở Lập trình GUI rồi cho nên tôi xin được phép không nói lại.

Tổng Kết
Trên đây chúng ta đã làm việc với một số câu lệnh giúp ta giải quyết vấn để tạo noise hay là nhiễu hạt trong 1 bức ảnh trên phần mền Maltab. Hi vọng bài viết này sẽ giúp ích cho bạn. Chúc bạn thành công!