Matlab 独立动手实现高斯滤波
close all;
clear all;
clc;
I = imread('1.jpg');
I = imnoise(I,'gaussian',0,0.01);
[img_w,img_h,img_channel] = size(I);
figure;imshow(I);
for channel=1:1:img_channel
img=I(:,:,channel);
core_size=5;%卷积核大小,必须是奇数
sigma=1;%标准差
%%
%生成高斯核
core_xy=(core_size+1)./2;
for x=1:1:core_size
for y=1:1:core_size
r2=sqrt(abs(x-core_xy))+sqrt(abs(y-core_xy));
kernel(x,y)=exp((-r2)./(2.*sigma*sigma));
end
end
kernel=kernel./sum(sum(kernel));
core_size=size(kernel,1);
core_xy=(core_size+1)./2;
%%
expert_size=(size(kernel,1)-1);%补零大小
img_data=uint8(zeros(size(img,1)+expert_size,size(img,2)+expert_size));
for x=1:1:size(img,1)
for y=1:1:size(img,2)
img_data(x+(expert_size./2),y+(expert_size./2))=img(x,y);
end
end
%%
%卷积
img_data2=img_data;%设置临时变量
for x=core_xy :1:size(img_data,1)-core_xy+1
for y=core_xy :1:size(img_data,2)-core_xy+1
a=[];%设置临时变量,保存每个卷积子块对应的值
for i=-core_xy+1:1:core_xy-1
for j=-core_xy+1:1:core_xy-1
a(i+core_xy,j+core_xy)=kernel(i+core_xy,j+core_xy)*img_data(x+i,y+j) ;
end
end
img_data2(x,y)=sum(sum(a));
end
end
img_data2=imcrop(img_data2,[expert_size./2+1 expert_size./2+1 size(img,2)-1 size(img,1)-1]);%位置和区域大小
I(:,:,channel)=img_data2;
end
figure;imshow(I);