function result =my_imfilter(I, h)% 此函数只能处理灰度图像
[m n]=size(I);
i_add =zeros(m+2,n+2);[m_add n_add]=size(i_add);% 此处i_add为填充0边后的矩阵图像
i_add(2:m+1,2:n+1)=I(1:m,1:n);% 在对i_add进行卷积时,不能让卷积后的结果影响未卷积的,所以创建个i_add_copy来作为不变的图像
i_add_copy = i_add;%size(h,1)是获取矩阵h的行数
% 又因为此矩阵为正方形,所以行数与列数相等
ker =size(h,1);
ker_radius =(ker-1)*0.5;for j =1:(m_add-ker+1)for i =1:(n_add-ker+1)%(j+ker_radius, i+ker_radius) 中心坐标
i_add(j+ker_radius, i+ker_radius)=my_convo(j, i, ker, i_add_copy,h);
end
end
i_add_sub =zeros(m,n);% 把0边框去掉
i_add_sub(1:m,1:n)=i_add(2:m+1,2:n+1);
result =uint8(i_add_sub);
end
function J =my_convo(j,i,ker,i_add_copy,h)
sum =0;[m n]=size(h);
h_copy =zeros(m,n);h_copy(1:ker,1:ker)=h(1:ker,1:ker).*i_add_copy(j:j+ker-1, i:i+ker-1);for y =1:ker
for x =1:ker
sum = sum+h_copy(y,x);
end
end
J = sum;
end
clear, clc, close all;% 卷积模版大小=6*sigma+1最为合适
I =imread('3.jpg');
I =rgb2gray(I);
h =[121;242;121]./16;
i =my_imfilter(I,h);
figure;subplot(121),imshow(I),title('original image');subplot(122),imshow(i),title('gaussian smooth1');