Khử nhiễu trong xử lý ảnh
Đệ tử 2 túi
Tham gia ngày: Apr 2007 Nơi Cư Ngụ: Ho Chi Minh Bài gửi: 27 Vấn Đề Nhiễu Ảnh-Image Noise - Nhiễu là một hiện tượng ngẫu nhiên đều có mặt trong mọi hệ thống xử lý tín hiệu thực (real signal) - Nhiễu xuất hiện khi có sự bức xạ đơn sắc nằm rải rác trên bề mặt ảnh, độ lởm chởm trên bề mặt tùy thuộc vào bước sóng của điểm ảnh. - Do có sự giao thoa giữa các sóng ảnh nên làm xuất hiện những vết lốm đốm trên ảnh - Là nhiễu cộng và độc lập (independent, additive noise) – nhiễu n(i,j) có phân tán Gauss (trung bình = zero) được mô tả bởi độ lệch chuẩn (standard deviation), hay phương sai - Mỗi pixel trong ảnh nhiễu là tổng giá trị pixel đúng (true pixel) và pixel ngẫu nhiên 3.Nhiễu muối – tiêu (Salt & Pepper noise): Các bộ lọc nhiễu :Giới thiệu bộ lọc Median (Trung vị) và bộ lọc mean -Những hình ảnh ta thu được thường hay bị nhiễu. - Khi hình ảnh bị nhiễu thì điều chúng ta cần làm là khắc phục hay giảm ảnh hưởng của nhiễu. - Nếu nhiễu là nhiễu cộng thì ta cần áp dụng mạch xử lí tuyến tính để lọc nhiễu, còn đối với nhiễu nhân thì cần phải dùng mạch xử lí phi tuyến. Ở đây ta sẽ tìm hiểu quá trình xử lí phi tuyến dùng để khắc phục nhiễu nhân, đó là phương pháp lọc Median. Mô tả khái quát phương pháp: Phương pháp median được tính toán như sau: Giá trị giữa chính xác sẽ là giá trị của một trong các pixels lân cận, lọc median sẽ không tạo ra pixel mới có giá trị không chân thật khi bộ lọc tăng mức độ lọc. Vì lí do này mà lọc median thì tốt hơn trong việc đảm bảo mức sắc nét của hình ảnh. Bộ lọc median cho phép phần lớn các chi tiết ảnh có tần số không gian cao đi qua trong khi đó nó sẽ loại trừ có hiệu quả nhiễu trên ảnh (kết quả của việc này là bộ lọc median ít có tác dụng trong việc khử nhiễu xảy ra trên ảnh với nhiễu Gauss). 2. Giới thiệu mạch lọc Mean Khuyết điểm: Khắc phục: rows = figpos(4);
cols = figpos(3); hs = (cols-(3*128)) / 4; % Horizantal Spacing Std.Interruptible = 'off'; % Defaults for image axes Img = Std; Ctl = Std; Btn = Ctl; Edit = Ctl; Menu = Ctl; Text = Ctl; btnHt = 26; %================================ %================================ %================================ %================================= menuWid = (fwid-4*ifs)/3; %================================ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %
%=================================================
ud.hGaussianVariance = uicontrol(Edit, ... %%% The controls for the noise removal filters ud.hNeighborhoodPop = uicontrol(Menu, ... %==================================== ud.hClose=uicontrol(Btn, ... %==================================== set(NrfiltDemoFig, 'UserData', ud); LoadNewImage(NrfiltDemoFig) %%% Sub-Function - AddNoise if nargin<1 switch ud.NoiseType set(ud.hCorruptedImage, 'Cdata', noisy); drawnow %%% Sub-Function - ApplyFilter function ApplyFilter(DemoFig) if nargin<1 switch ud.FilterType set(ud.hFilteredImage, 'Cdata', filtered); setstatus(DemoFig,''); %%% Sub-Function - LoadNewImage function LoadNewImage(DemoFig) if nargin<1 set(DemoFig,'Pointer','watch'); drawnow switch
name img = double(img)/255; %%% function EditBoxUpdate(whichBox) DemoFig = gcbf; %%% Sub-Function - AddNoiseOff_ApplyFilterOn function AddNoiseOff_ApplyFilterOn(DemoFig) ud = get(DemoFig, 'UserData'); %%% Sub-Function - AddNoiseOn_ApplyFilterOff function
AddNoiseOn_ApplyFilterOff(DemoFig) ud = get(DemoFig, 'UserData'); %%% Sub-Function - UpdateNoiseType function UpdateNoiseType(DemoFig) if nargin<1 ud.NoiseType = noisetype; drawnow switch noisetype %%% Sub-Function - BringUpGaussianControls function BringUpGaussianControls(DemoFig) if nargin<1 %%% Sub-Function - BringUpSaltNPepperControls function BringUpSaltNPepperControls(DemoFig) if nargin<1 %%% Sub-Function - BringUpSpeckleControls function BringUpSpeckleControls(DemoFig) if nargin<1 %%% Sub-Function - UpdateFilterType function
UpdateFilterType(DemoFig) if nargin<1 if ~ud.CorruptedImageIsStale set(ud.hApplyFilterBtn, 'Enable', 'on'); setstatus('Press "THỰC HIỆN" to denoise the corrupted image.'); end set(DemoFig, 'UserData', ud); %%% Sub-Function - UpdateNeighborhoodSize function UpdateNeighborhoodSize(DemoFig) if nargin<1 ud.NeighborhoodSize = str2double(neighborhood(1)); if ~ud.CorruptedImageIsStale set(ud.hApplyFilterBtn, 'Enable', 'on'); setstatus('Press "THỰC HIỆN" to denoise the corrupted image.'); end set(DemoFig, 'UserData', ud, 'Pointer', 'arrow'); |