实现原理
1.根据卷积核大小对图像进行全零填充
2.根据填充类型定义卷积核
3.从图像三维矩阵抽取矩阵,进行卷积
4.输出处理后的图像
function [img] = img_filter(img,type,scale)
if mod(scale,2)~= 0
info = size(img);
%图像全零填充
pad_img = zeros(scale-1+info(1),scale-1+info(2),info(3));
pad_img((scale-1)/2 +1:(scale-1)/2+info(1),(scale-1)/2 +1:(scale-1)/2+info(2),:) = img;
%滤波类型
if strcmp(type,'cross');
kernel = zeros(scale,scale,3);
kernel((scale-1)/2+1,:,:) = 1;
kernel(:,(scale-1)/2+1,:) = 1;
kernel_info = size(kernel);
for r = (scale-1)/2 +1:(scale-1)/2+info(1)
for l = (scale-1)/2 +1:(scale-1)/2+info(2)
extract_matrix = pad_img(r-(scale-1)/2:r+(scale-1)/2,l-(scale-1)/2:l+(scale-1)/2,:);
B= sort(reshape(extract_matrix .* kernel,[],3));
img(r-(scale-1)/2,l-(scale-1)/2 ,:) =median(B(scale^2-2*scale+2:end,:));
end
end
else strcmp(type,'average');
kernel = ones(scale,scale,info(3));
kernel_info = size(kernel);
%遍历滤波 找块,卷积,求值
for r = (scale-1)/2 +1:(scale-1)/2+info(1)
for l = (scale-1)/2 +1:(scale-1)/2+info(2)
extract_matrix = pad_img(r-(scale-1)/2:r+(scale-1)/2,l-(scale-1)/2:l+(scale-1)/2,:);
img(r-(scale-1)/2,l-(scale-1)/2 ,:) = sum(sum(extract_matrix .* kernel,1),2)/(kernel_info (1)*kernel_info(2));
end
end
end
end
end
使用方法
img_filter(img , type, scale):
img: 三维矩阵。 输入的待处理图像,大小无要求,要求必须是三通道图像,不识别灰度图。
type:字符串。 滤波类型,可输入’cross’ 调用十字中值滤波 或 ‘average’ 调用均值滤波。
scale:整型。 滤波核大小, 必须是单数,如3,代表3×3的卷积核。
举例:
close all;clear all;clc
load('dip_pic.mat');
cross = img_filter(test,'cross',5);
average = img_filter(test,'average',5);
subplot(2,2,1);imshow(rgb);title('原图')
subplot(2,2,2);imshow(test);title('噪声图')
subplot(2,2,3);imshow(cross);title('十字滤波')
subplot(2,2,4);imshow(average);title('均值滤波')
效果展示