matlab实现图像滤波——高斯滤波

2021年9月6日 7点热度 0条评论 来源: 一只小草

要求

生成一个(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高斯滤波');

 

    原文作者:一只小草
    原文地址: https://blog.csdn.net/ytang_/article/details/52749497
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。