功能:對任意類型數組或多維圖像進行濾波。
用法:B = imfilter(A,H)
B = imfilter(A,H,option1,option2,...)
或寫作g = imfilter(f, w, filtering_mode, boundary_options, size_options)
其中,f爲輸入圖像,w爲濾波掩模,g爲濾波後圖像。filtering_mode用於指定在濾波過程中是使用“相關”還是“卷積”。boundary_options用於處理邊界充零問題,邊界的大小由濾波器的大小確定。具體參數選項見下表:
選項 | 描述 | |
filtering_mode | ‘corr’ | 通過使用相關來完成,該值爲默認。 |
‘conv’ | 通過使用卷積來完成 | |
boundary_options | ‘X’ | 輸入圖像的邊界通過用值X(無引號)來填充擴展 其默認值爲0 |
‘replicate’ | 圖像大小通過複製外邊界的值來擴展 | |
‘symmetric’ | 圖像大小通過鏡像反射其邊界來擴展 | |
‘circular’ | 圖像大小通過將圖像看成是一個二維週期函數的一個週期來擴展 | |
size_options | ‘full’ | 輸出圖像的大小與被擴展圖像的大小相同 |
‘same’ | 輸出圖像的大小與輸入圖像的大小相同。這可通過將濾波掩模的中心點的偏移限制到原圖像中包含的點來實現,該值爲默認值。 |
舉例:
例1:
originalRGB = imread('peppers.png');
imshow(originalRGB)
h = fspecial('motion', 50, 45);%創建一個濾波器
filteredRGB = imfilter(originalRGB, h);
figure, imshow(filteredRGB)
例2:
%生成一個8x8的均值濾波器
originalRGB = imread('peppers.png');
imshow(originalRGB)
w = fspecial('average',8);
filteredRGB = imfilter(originalRGB, w);
figure, imshow(filteredRGB)
例3:
單色圖像的平滑:
單色圖像(如灰度圖像)平滑的過程:定義一個係數爲1的模板,用這個空間模板的係數去乘以所有像素的值,並將結果除以模板中元素的總數。
彩色圖像的平滑:
1、抽取圖像:I(R、G、B)三幅分量。
>>fR = I(:,:,1);
>>fG = I(:,:,2);
>>fB = I(:,:,3);
2、 (1): 分別對(R、G、B)這三幅圖像分量進行濾波。例如:平均濾波器 w = fspecial('average', 25); 來進行平滑處理。
>>fR_filtered = imfilter(fR, w, 'replicate');
>>fG_filtered = imfilter(fG, w, 'replicate');
>>fB_filtered = imfilter(fB, w, 'replicate');
(2):也可以對(R、G、B)這三個圖像分量一起處理,不用進行第三步。
>>fc_filtered = imfilter(I, w, 'replicate');
3、重建濾波後的 RGB 的圖像。
>>fc_filtered = cat(3, fR_filtered, fG_filtered, fB_filtered)
例子程序:
close all
clear all
clc
I = imread('olivian.jpg'); %讀取一張噪聲圖像
%提取圖像的三個(R、G、B)分量圖像
R = I(:,:,1);
G = I(:,:,2);
B = I(:,:,3);
%生成一個8x8的均值濾波器
w = fspecial('average',8);
fR = imfilter(R,w,'replicate');
fG = imfilter(G,w,'replicate');
fB = imfilter(B,w,'replicate');
fc_filtered = cat(3,fR,fG,fB); %將這四個句子可以改爲:fc_filtered = imfilter(I, w, 'replicate');
figure
subplot(121);
imshow(I);title('彩色噪聲圖像');
subplot(122);
imshow(fc_filtered,'Border','tight');title('彩色圖像平滑處理');
一維相關與卷積
圖1(a)顯示了一維函數f和模板w。假設f的原點定爲最左側的點。爲執行兩個函數的相關,可移動w使其最右側的點與f的原點重合,如圖1(b)所示。需要注意的是,這兩個函數之間有一些點未重疊。爲處理該問題,最普遍的方法是在f中填充足夠多的0(對應表1-1中邊界選項boundary_options的默認值P),以保證在w通過f的整個過程中,始終存在對應的點。如圖1(c)所示。
現在準備執行相關操作。相關操作結果第一個值是在圖1(c)所示位置上兩個函數對應位置乘積的累加和。接着將w向右移動一個位置並重覆上述過程,如圖1(d)所示。經過4次移動後,如圖1(e)所示。以此類推,直至w全部通過f,最終得到如圖1(f)所示。得到的w與f的相關如圖1(g)所示。
在圖1(g)所示的相關中,符號’full’是由MATLAB圖像處理工具箱使用的標記,用來指示相關操作按上述方式計算時使用了經過充零後的圖像。同樣,工具箱還提供了另一個’same’選項,可以產生大小與f相同的相關。這種計算同樣也使用經過充零後的圖像,但開始位置位於與f的原點對準的模板的中線點。最後的計算時使f的最後一個點與模板的中心點對準。
圖2 一維卷積操作說明
爲了執行卷積,將w旋轉180度,使其最右側的點與f的原點重疊,如圖2(b)所示。然後重複在相關操作中使用的滑動計算過程,如圖2(c)到圖2(f)所示。’full’和’same’卷積結果分別如圖2(g)和圖2-2(h)所示。
二維相關與卷積
上述情況很容易推廣到二維圖像中,如圖3所示。原點位於圖像f(x,y)的左上角。爲了執行相關計算,設置w(x,y)的最右下角點,使之與f(x,y)的原點重合,如圖3(c)所示。與一維情況類似,這裏我們使用了零填充。然後在所有可能的位置上移動w(x,y),使得它的至少一個像素會與原始圖像f(x,y)中的某個像素重疊。這個’full’相關的結果如圖3(d)所示。爲得到圖3(e)中所示的’same’相關,我們要求w(x,y)的所有偏移都能實現中心像素覆蓋原始的f(x,y)。
圖3 二維相關操作示例
對於卷積,我們將w(x,y)旋轉180度,其他處理方式與相關操作相同,參見圖4(a)到圖4(c)。