濾波演算法、中值和均值濾波區別
濾波演算法:
這裡所講的演算法都是針對影象空間的濾波演算法,其中模板,可以理解為影象形態學中的結構元素,是用來選取影象中的那些畫素點被用來操作的。空間濾波根據其功能劃分為平滑濾波和銳化濾波。平滑濾波:能減弱或者消除影象中高頻率分量,但不影響低頻率分量,在實際應用中可用來消除噪聲。銳化濾波:與平滑濾波相反,能減弱或者消除影象中低頻率分量,但不影響高頻率分量,可使影象反差增加,邊緣明顯。實際應用可用於增強被模糊的細節或者目標的邊緣。
空間增強濾波技術分類:
1、線性平滑濾波
(1)方框濾波:用一個畫素的領域畫素值之和作為濾波結果,鄰域即模板所覆蓋的影象區域,此時模板的所有係數都為1.
(2)鄰域平均:是特殊大方框濾波,用一個畫素的領域平均畫素值作為濾波結果,即a為第一種情。
其中N(x,y)為模板歲覆蓋的影象的區域,n為模板的尺寸。
(3)加權平均:此時的模板係數不是1,而是具體的係數。一般認為距離模板中心的畫素應對濾波結果有較大的貢獻,所以可將接近模板中心的係數取得比模板周邊的係數。
(4)高斯平均:是一種特殊的加權平均,只不過模板中的係數由高斯分佈來確定的。
2、線性銳化濾波
(1)拉普拉斯運算元
拉普拉斯運算元是一種各向同性的二階微分運算元,利用微分系數來確定模板係數,然後再與影象進行卷積運算,從而實現銳化濾波。
根據拉普拉斯定義:
兩個分別沿X和Y方向的二階偏導均可藉助差分計算:
合併為:
當模板為4-鄰域時 當模板為8-鄰域時
以上兩種模板的係數之和為0,這是為了使經過模板運算的影象的均值不變。拉普拉斯運算元增強了影象中的灰度不連續區域,而減弱了影象中灰度值緩慢變化區域對比度,將這樣的結果疊加到原始影象中,就可以得到銳化後的額影象。
(2)高頻提升濾波
影象的銳化效果可以通過疊加影象的微分結果得到,也可以通過減除影象積分結果得到。
設原始影象為f(x,y),平滑後的影象為g(x,y):
非銳化掩模:h(x,y) = f(x,y)-g(x,y)
銳化影象:{ f(x,y)- g(x,y) } + f(x,y)
高頻提升濾波:把圖形乘以一個放大係數A,再減去平滑影象
可轉化為:
當A=1時,為非銳化掩模;
當A=2時,為非銳化掩模化。
3、非線性平滑濾波
(1)中值濾波:對模板下對應的畫素值進行升序排序,選取中間值作為結果。
(2)與中值濾波類似的,還有最大值、最小值、中點濾波
以上四種濾波也稱之為百分比濾波,百分比濾波基於模板的排序來工作,又叫作序統計濾波。
參考:https://blog.csdn.net/swj110119/article/details/51321109
均值濾波及中值濾波的區別
均值濾波和和中值濾波都可以起到平滑影象,慮去噪聲的功能。均值濾波採用線性的方法,平均整個視窗範圍內的畫素值,均值濾波本身存在著固有的缺陷,即它不能很好地保護影象細節,在影象去噪的同時也破壞了影象的細節部分,從而使影象變得模糊,不能很好地去除噪聲點。均值濾波對高斯噪聲表現較好,對椒鹽噪聲表現較差。中值濾波採用非線性的方法,它在平滑脈衝噪聲方面非常有效,同時它可以保護影象尖銳的邊緣,選擇適當的點來替代汙染點的值,所以處理效果好,對椒鹽噪聲表現較好,對高斯噪聲表現較差。
填充問題
在對影象應用濾波器進行過濾時,邊界問題是一個需要處理的問題。一般來說,有3種處理的方法。
1. 不做邊界處理
不對影象的邊界作任何處理,在對影象進行濾波時,濾波器沒有作用到影象的四周,因此影象的四周沒有發生改變。
2. 填充0
對影象的邊界做擴充套件,在擴充套件邊界中填充0,對於邊長為2k+1的方形濾波器,擴充套件的邊界大小為k,若原來的影象為[m, n],則擴充套件後圖像變為[m+2k, n+2k]。進行濾波之後,影象會出現一條黑色的邊框。
3. 填充最近畫素值
擴充套件與 填充0 的擴充套件類似,只不過填充0的擴充套件是在擴充套件部分填充0,而這個方法是填充距離最近的畫素的值。
matlab程式碼實現
1. 均值濾波函式如下
該函式為spacelFilter,輸入為需要進行濾波的影象(L = 256,畫素值為0-255的灰度影象),方形濾波器(大小為2k+1,值型別為uint8),輸出為經過濾波器濾波之後的影象。該函式濾波採用填充最近畫素值的方法,結果影象不會出現黑邊。
function [image_out] = spacelFilter(image_in, filter)
% (線性)均值濾波函式
% 輸入為需要進行空間濾波的灰度影象,線性方形濾波器
% 輸出為經過濾波之後的影象
% 影象邊緣的填充為最近的畫素值,目的是消除填充0時會出現的黑框
% 濾波器的大小為 n * n, n = 2 * k + 1, k為整數
% 輸入影象大小為 m * n, 灰度影象,畫素值範圍為0-255,L = 256
[m, n] = size(image_in);
[mf, nf] = size(filter);
k = (mf - 1) / 2;
image2 = zeros(m+2*k, n+2*k, 'double');
image_out = zeros(m, n, 'uint8');
coeff = sum(filter(:));
% 填充部分
% 內部直接複製
for i = 1+k : m+k
for j = 1+k : n+k
image2(i, j) = image_in(i-k, j-k);
end
end
% 填充上下邊緣
for i = 1 : k
for j = 1 : n
image2(i, j+k) = image_in(1, j);
image2(m+k+i, j+k) = image_in(m, j);
end
end
% 填充左右邊緣
for i = 1 : m
for j = 1 : k
image2(i+k, j) = image_in(i, 1);
image2(i+k, n+k+j) = image_in(i, n);
end
end
% 填充四個角
for i = 1 : k
for j = 1 : k
image2(i, j) = image_in(1, 1); %填充左上角
image2(i, j+n+k) = image_in(1, n); %填充右上角
image2(i+n+k, j) = image_in(m, 1); %填充左下角
image2(i+n+k, j+n+k) = image_in(m, n); %填充右下角
end
end
% 濾波部分
for i = 1+k : m+k
for j = 1+k : n+k
sub_image = image2(i-k:i+k, j-k:j+k);
temp1 = double(filter') .* double(sub_image);
temp2 = sum(temp1(:)) / coeff;
image_out(i-k, j-k) = uint8(temp2);
end
end
end
2. 中值濾波器
實現與均值濾波器類似,只不過在濾波部分的實現有所不同。
% 濾波部分
for i = 1+k : m+k
for j = 1+k : n+k
sub_image = image2(i-k:i+k, j-k:j+k);
temp = median(sub_image(:));
image_out(i-k, j-k) = uint8(temp);
end
end
3. 測試程式碼如下
為了方便,我在spacelFilter函式中增加了中值濾波部分,增加了一個返回值,這樣spacelFilter函式的返回值為[image1,image2],image1為均值濾波影象,image2為中值濾波影象。
close all;
clear all;
clc;
image = imread('2.tif');
[m, n] = size(image);
%模板大小
k = 3;
myFilter = zeros(k, k, 'uint8');
for i = 1 : k
for j = 1 : k
myFilter(i, j) = 1;
end
end
[image2, image3] = spacelFilter(image, myFilter);
image4 = medfilt2(image, [3 3]);
figure;
subplot(2, 2, 1), imshow(image), title('原影象');
subplot(2, 2, 2), imshow(image2), title('3*3均值濾波影象');
subplot(2, 2, 3), imshow(image3), title('3*3中值濾波影象');
subplot(2, 2, 4), imshow(image4), title('matlab自帶的中值濾波影象');
4. 程式碼執行結果如下(測試影象為被椒鹽噪聲汙染的影象):
原文:https://blog.csdn.net/cjsh_123456/article/details/79261271