MATLAB图像的频域低通滤波(灰度图像滤波+彩色图像滤波)
數字圖像處理完整MATLAB代碼在我的資源可以看到,為方便下載,下面是百度網盤資源:
鏈接:https://pan.baidu.com/s/17S7PZJwwvb3PFMFVxqEY5w?
提取碼:HUAT
濾波代碼:
function l_f = low_filter(img,fre) %此函數用于對圖像進行濾波 %主要原理為在圖像平移后頻譜圖進行圈定范圍(面積)操作,面積外的設為0(濾除高頻成分) %img為圖像平移后頻譜圖,fre為圈定的頻譜范圍 [a,b] = size(img); a0 = round(a/2); b0 = round(b/2); for i=1:afor j=1:bdistance = (i-a0)^2+(j-b0)^2;if distance<freh = 1;elseh = 0;endl_f(i,j) = h*img(i,j);end endend一、灰度圖像濾波
具體處理過程如下:
1.Imread函數讀取圖像數據
2.RGB圖像轉換為灰度二維圖
3.調用fft2函數對灰度二維圖像進行DFT處理
4.調用abs函數取得頻譜采用log處理,進行灰度壓縮
5.調用fftshift函數中心化處理
6.利用理想低通濾波器low_filter(現有多種低通濾波器,自己可以進行選擇設計)對圖像頻譜進行濾波,濾除高頻成分
? ? ? ?在我看來,?這里的低通濾波器設計原理其實很簡單,就是在步驟5處理后,圖像頻譜圖的分布規律為:圖像的低頻信息位于圖像頻譜圖的中心,自圖像頻譜圖中心向外延申,圖像所包含的信息的頻率越高(而噪聲的頻率也很高),這也就可以通過保留靠近頻譜圖中心的部分(圖像包含的低頻信息),舍去遠離頻譜圖中心的部分(高頻噪聲),濾除圖像中的噪聲。下面是圓形低通濾波器的代碼,以及濾波前后的圖像頻譜圖。
? ? ? ? ? ? ? ? ? ? ?
? ? ? ??
(1).步驟5處理后的圖像頻譜圖? ? ? ? ? ?(2).理想低通濾波器low_filter濾除高頻后的圖像頻譜圖
7.調用ifftshift函數去中心化處理
8.對輸出結果ifft2反變化得到濾波后的圖像
下面是濾波的過程結果,左側滑塊功能為調節低通濾波器的濾波范圍。
global My_GUI_handles; fre=get(hObject,'Value'); set(handles.text_l_f1,'String',num2str(fre));axes(My_GUI_handles.axes_dst); img_src=getimage(My_GUI_handles.axes_src); img_src=rgb2gray(img_src);%轉換為灰度二維 img_src1=double(img_src); %數據類型轉換 % % img_src2=fft2(img_src1);%快速傅里葉變換 % % img_src3=fftshift(img_src2);%頻譜平移 % % img_src4=abs(img_src3);%計算I的幅度譜img_src2=abs(fftshift(fft2(img_src1))); imshow(log(img_src2),[]); title('圖像傅里葉變換取對數所得頻譜');axes(My_GUI_handles.axes_src1); [a,b] = size(img_src1); s_max = min(a/2,b/2); s_max = s_max^2; set(handles.slider_l_f1,'Max',double(s_max));img_src5= low_filter(fftshift(fft2(img_src1)),fre); imshow(log(abs(img_src5)),[]); title('低通濾波頻譜');axes(My_GUI_handles.axes_dst1); new_img = uint8(real(ifft2(ifftshift(img_src5)))); imshow(new_img,[]); title('低通濾波后的圖像');set(handles.slider_l_f2,'Enable','off');二、彩色圖像(RGB)濾波
? ? ? ?我們知道一般對于RGB圖像頻域濾波都需要先轉換成灰度二維圖,才能進行頻域低通濾波,這也導致最終顯示的圖像也只能是灰度圖。分析其原因可知,這是由于我們對于圖像處理需要用到fft2等函數造成的。那么如何才能對RGB圖像進行頻域濾波后,讓它顯示為RGB圖像呢?在參考了網上一篇北京交通大學王瀟的《利用MATLAB對彩色圖像進行低通濾波》的文章后,得知可以對圖像的R、G、B圖像分別進行上述濾波后,再將R、G、B濾波后的圖合成一張顯示出來,以此達到對RGB圖像進行頻域濾波后依然可以顯示濾波后的RGB圖像。具體過程如下。
1.Imread函數讀取圖像
2.將RGB圖像拆分為R、G、B三張單色圖
3.調用fft2函數對R、G、B單色圖分別進行進行DFT處理
4.調用abs函數取得頻譜采用log處理,進行灰度壓縮
5.調用fftshift函數中心化處理
6.利用理想低通濾波器low_filter對圖像頻譜進行濾波,濾除高頻成分
7.調用ifftshift函數去中心化處理
8.對輸出結果ifft2反變化得到濾波后的R、G、B圖像
9.將分別處理后的R、G、B圖像合成為一幅圖像,然后進行顯示,得到頻域濾波后的RGB圖像
下面是濾波的過程結果,第一行第二列和第二行第一列分別為:R單色圖濾波后的頻譜圖、G單色圖濾波后的頻譜圖。左側滑塊功能為調節低通濾波器的濾波范圍。
global My_GUI_handles; fre=get(hObject,'Value'); set(handles.text_l_f2,'String',num2str(fre));axes(My_GUI_handles.axes_dst); img_src=getimage(My_GUI_handles.axes_src); [a,b] = size(img_src); s_max = min(a/2,b/2); s_max = s_max^2; set(handles.slider_l_f2,'Max',double(s_max));for i=1:3A=img_src(:,:,i);B=double(A);C= low_filter(fftshift(fft2(B)),fre);D = uint8(real(ifft2(ifftshift(C))));img_src(:,:,i)=D; end img_src_R= low_filter(fftshift(fft2(double(img_src(:,:,1)))),fre); imshow(log(abs(img_src_R)),[]); axes(My_GUI_handles.axes_src1); img_src_G= low_filter(fftshift(fft2(double(img_src(:,:,2)))),fre); imshow(log(abs(img_src_G)),[]); axes(My_GUI_handles.axes_dst1); imshow(img_src); set(handles.slider_l_f1,'Enable','off');總結
以上是生活随笔為你收集整理的MATLAB图像的频域低通滤波(灰度图像滤波+彩色图像滤波)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 根号近似计算公式
- 下一篇: Excel-查找和引用函数