均值濾波及中值濾波的區別

均值濾波及中值濾波的區別

轉自:https://blog.csdn.net/cjsh_123456/article/details/79261271


均值濾波和和中值濾波都可以起到平滑圖像,濾去噪聲的功能。均值濾波採用線性的方法,平均整個窗口範圍內的像素值,均值濾波本身存在着固有的缺陷,即它不能很好地保護圖像細節,在圖像去噪的同時也破壞了圖像的細節部分,從而使圖像變得模糊,不能很好地去除噪聲點。均值濾波對高斯噪聲表現較好,對椒鹽噪聲表現較差。中值濾波採用非線性的方法,它在平滑脈衝噪聲方面非常有效,同時它可以保護圖像尖銳的邊緣,選擇適當的點來替代污染點的值,所以處理效果好,對椒鹽噪聲表現較好,對高斯噪聲表現較差。


填充問題


在對圖像應用濾波器進行過濾時,邊界問題是一個需要處理的問題。一般來說,有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(‘33均值濾波圖像’);
subplot(2, 2, 3), imshow(image3), title('33中值濾波圖像’);
subplot(2, 2, 4), imshow(image4), title(‘matlab自帶的中值濾波圖像’);

4. 代碼運行結果如下(測試圖像爲被椒鹽噪聲污染的圖像):



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章