天天看點

space1Filter程式,用于均值濾波和中值濾波,matlab

space1Filter程式,用于均值濾波和中值濾波,matlab

function [image_out1,image_out2] = 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_out1 = zeros(m, n, 'uint8');
image_out2 = 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_out1(i-k, j-k) = uint8(temp2);
    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);
        temp = median(sub_image(:));
        image_out2(i-k, j-k) = uint8(temp);
    end
end      

主函數從下面連結中檢視:

繼續閱讀