生成一个(2N+1)×(2N+1)大小的高斯模板H(标准为sigma),然后用此模板对图像进行滤波。不允许使用 fspecial 来产生高斯模板,不允许使用 imfilter、conv2 等函数。
理解:高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值
步骤:
1. 高斯模板公式,计算高斯模板,即实现fspecial 。
2. 实现相关算子的imfilter;相关算子方式 计算公式如下。W表示高斯算子,a,b表示算子大小。
举例说明:
Imfilter的实现,对于非中心图像点,采用了两种方案。方案一:直接不处理边缘点。方案二:扩充原图像,形成一个中间图像,根据N增加边缘行和列,使得原图像中所有的点都可以处于算子的中心点。
测试结果如下:
当sigma=1.6,N=7时。
方案一的效果截图见下图。之前测试N=1和N=3时,效果还不错,边缘的噪点比较少,但是当变成N=7时,效果很差,可以很明显地发现边缘有很多噪点。
方案二的效果截图见下图。对比MATLAB自带的imfilter默认的滤波函数,效果不错。
思考反馈:
测试的时候,使用的是彩色图片,然后出现的测试结果见下图。结果图像首先是灰度的,还是有三个的,所以思考良久,可能是grb通道原因,换成了灰度图像后,就可以了。/(ㄒoㄒ)/~~出问题的时候,居然一度怀疑自己算法有问题/(ㄒoㄒ)/~~然后查看了十几分钟……
所以如果是彩色图像的话,是不是要分三个通道处理?还是说有其他比较好的方法。
高斯滤波彩色图像出问题截图
clear all;
close all;
% 不处理边缘的高斯滤波,对应文档的方案一
originimg=imread('lena.jpg');
originimg=rgb2gray(originimg);
[ori_row,ori_col]=size(originimg);
sigma = 1.6; %sigma赋值
N = 7; %大小是(2N+1)×(2N+1)
N_row = 2*N+1;
OriImage_noise = imnoise(originimg,'gaussian'); %加噪
gausFilter = fspecial('gaussian',[N_row N_row],sigma); %matlab 自带高斯模板滤波
blur=imfilter(OriImage_noise,gausFilter,'conv');
H = []; %求高斯模板H
for i=1:N_row
for j=1:N_row
fenzi=double((i-N-1)^2+(j-N-1)^2);
H(i,j)=exp(-fenzi/(2*sigma*sigma))/(2*pi*sigma);
end
end
H=H/sum(H(:)); %归一化
desimg=zeros(ori_row,ori_col); %滤波后图像
for i=1:ori_row
for j=1:ori_col
desimg(i,j)=OriImage_noise(i,j);
end
end
temp=[];
for ai=N+1:ori_row-N-1
for aj=N+1:ori_col-N-1
temp=0;
for bi=1:N_row
for bj=1:N_row
temp= temp+(desimg(ai+bi-N,aj+bj-N)*H(bi,bj));
end
end
desimg(ai,aj)=temp;
end
end
desimg=uint8(desimg);
subplot(2,2,1);imshow(originimg);title('原图');
subplot(2,2,2);imshow(OriImage_noise);title('噪声图');
subplot(2,2,3);imshow(desimg);title('myself高斯滤波');
subplot(2,2,4);imshow(blur);title('matlab高斯滤波');
clear all;
close all;
% 扩展原图像的高斯滤波,对应文档的方案2
originimg=imread('lena.jpg');
originimg=rgb2gray(originimg);
[ori_row,ori_col]=size(originimg);
sigma = 1.6; %sigma赋值
N = 7; %大小是(2N+1)×(2N+1)
N_row = 2*N+1;
OriImage_noise = imnoise(originimg,'gaussian'); %加噪
gausFilter = fspecial('gaussian',[N_row N_row],sigma); %matlab 自带高斯模板滤波
blur=imfilter(OriImage_noise,gausFilter,'conv');
H = []; %求高斯模板H
for i=1:N_row
for j=1:N_row
fenzi=double((i-N-1)^2+(j-N-1)^2);
H(i,j)=exp(-fenzi/(2*sigma*sigma))/(2*pi*sigma);
end
end
H=H/sum(H(:)); %归一化
desimg=zeros(ori_row,ori_col); %滤波后图像
midimg=zeros(ori_row+2*N,ori_col+2*N); %中间图像
for i=1:ori_row %原图像赋值给中间图像,四周边缘设置为0
for j=1:ori_col
midimg(i+N,j+N)=OriImage_noise(i,j);
end
end
temp=[];
for ai=N+1:ori_row+N
for aj=N+1:ori_col+N
temp_row=ai-N;
temp_col=aj-N;
temp=0;
for bi=1:N_row
for bj=1:N_row
temp= temp+(midimg(temp_row+bi-1,temp_col+bj-1)*H(bi,bj));
end
end
desimg(temp_row,temp_col)=temp;
end
end
desimg=uint8(desimg);
subplot(2,2,1);imshow(originimg);title('原图');
subplot(2,2,2);imshow(OriImage_noise);title('噪声图');
subplot(2,2,3);imshow(desimg);title('myself高斯滤波');
subplot(2,2,4);imshow(blur);title('matlab高斯滤波');