高斯模板(高斯滤波)的实现matlab版

时间:2024-10-28 07:12:12

高斯模板(高斯滤波)的实现

  • (一)目标
  • (二)前言
  • (三)相关知识
    • 1.高斯函数的定义
    • 2.高斯滤波原理
    • 3.高斯模板公式
    • 4.模板与图像滤波的实现(实质:卷积)
  • (四)不同方法实现高斯模板的区别
  • (五)实现过程与结果
    • 1.方法1
    • 2.方法2
    • 3.方法3
  • 参考文献

(一)目标

生成一个(2N+1)×(2N+1)大小的高斯模板H(标准为sigma),然后用此模板对图像进行滤波。
具体要求
在这里插入图片描述
注:这里采用了多种方法:
方法一:自己编写高斯模板,并用 imfilter等函数。
方法二:自己编写高斯模板,不能用imfilter等函数。
方法三:利用matlab中的 fspecial 来产生高斯模板。

(二)前言

为什么要讨论上述方法呢?
通过编程显示便可知道方法的不同产生的高斯函数会略有不同。编程前,我们首先应该了解一下高斯函数及高斯滤波。

(三)相关知识

1.高斯函数的定义

在这里插入图片描述在这里插入图片描述
根据一维高斯函数,可以推导得到二维高斯函数
在这里插入图片描述
参考博文:高斯函数以及在图像处理中的应用总结

2.高斯滤波原理

高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。

3.高斯模板公式

二维高斯模板可以通过矩阵M来实现,假设模板的大小为(2k+1, 2k+1), 其中k为模板中心,则M(i,j)的值如下所示:
在这里插入图片描述

4.模板与图像滤波的实现(实质:卷积)

在这里插入图片描述
其中,w表示高斯算子,a,b表示算子大小。

(四)不同方法实现高斯模板的区别

这里先放结果,代码部分见方法一
由于不同标准差会造成不同效果,编程代码见附录2,这里显示我以0.5:0.5:4.5的sigma来设计不同的15*15高斯低通模板显示不同高斯模板之间的区别,如下所示:
在这里插入图片描述

下面为我根据高斯函数表达书编写的高斯模板三维显示图:
在这里插入图片描述
Matlab中自带高斯模板函数,显示如下:
在这里插入图片描述
由上述可知,sigma越小,函数越窄越高,与前述的理论不同。高斯模板与自己编写的区别主要是在模板中心值的不同,中心像素值的不同会导致周围的值也有所不同,运行方法一中代码你就知道了,这里我就不放了。

(五)实现过程与结果

1.方法1

实验结果如下所示:
自己编写的滤波效果:
在这里插入图片描述
matlab自带
在这里插入图片描述
对比如下:(左边自己,后边matlab)
在这里插入图片描述
实验代码:

%% 文件说明
% 第三章数字图像处理作业第2次作业第2题做法1
% 要求:实现15*15的高斯低通模板
% 做法1:显示不同高斯模板区别并且与matlab中的高斯函数进行对比

N_size = 15; % size模板长度,假设模板为15*15,则size为15
%% 第一种方法:自己编码
center_N = (N_size + 1)/2; %模板中心位置,这里假设模板长度为奇数
N_row = N_size; 
N_col = N_size;
array_sigma = 0.5:0.5:4.5; %标准差数组,对模板的影响很大
Map_X = 1:N_row; Map_Y = 1:N_col; % 作3维图的横坐标

%% 绘制不同15*15高斯模板
% 高斯函数的实现
figure('Name', '不同高斯模板三维图')
for k =1:9
    sigma = array_sigma(k);
    for i=1 : N_row
        for j=1 : N_col
            distance_s = double((i-center_N-1)^2 + (j-center_N-1)^2);
            G_ry(i,j)=exp((-1) * distance_s/(2*sigma^2))/(2*pi*(sigma^2));
        end
    end
    % 这里以小数显示,显示整数模板可参考C = floor(G_ry.*(1/G_ry(1,1)))   
    disp(num2str(sigma));disp(G_ry)
    subplot(3,3,k);surf(Map_X,Map_Y,G_ry);title(num2str(sigma));
end

%% 绘制不同matlab的高斯函数
figure('Name', 'matlab不同高斯模板三维图')
for k =1:9
    sigma = array_sigma(k);
    gausFilter = fspecial('gaussian',[N_row N_col],sigma);   
    % 这里以小数显示,显示整数模板可参考C = floor(G_ry.*(1/G_ry(1,1)))   
    disp(num2str(sigma));disp(gausFilter)
    subplot(3,3,k);surf(Map_X,Map_Y,G_ry);title(num2str(sigma));
end

%% 编程的高斯模板处理前后对比图
figure('Name', '不同高斯模板滤波效果(my)')
srcImg = imread('pic_3_x2.jpg');
subplot(3,4,1);imshow(uint8(srcImg));title('原图');
grayImg = rgb2gray(srcImg);
subplot(3,4,5);imshow(uint8(grayImg));title('灰度图');
Image_noise = imnoise(grayImg,'gaussian'); %加噪
subplot(3,4,9);imshow(uint8(Image_noise));title('加噪图');
for k =1:9
    sigma = array_sigma(k);
    for i=1 : N_row
        for j=1 : N_col
            distance_s = double((i-center_N-1)^2 + (j-center_N-1)^2);
            G_ry(i,j)=exp((-1) * distance_s/(2*sigma^2))/(2*pi*(sigma^2));
        end
    end

    subplot(3,4,k+ ceil(k/3));
    Gry_Img = imfilter(Image_noise,G_ry);
    imshow(Gry_Img);title(num2str(sigma));
end

%% 制不同15*15高斯滤波效果
figure('Name', '不同高斯模板滤波效果(matlab)')
subplot(3,4,1);imshow(uint8(srcImg));title('原图');
subplot(3,4,5);imshow(uint8(grayImg));title('灰度图');
subplot(3,4,9);imshow(uint8(Image_noise));title('加噪图');
for k =1:9
    sigma = array_sigma(k);
    gausFilter = fspecial('gaussian',[N_row N_col],sigma);   

    subplot(3,4,k+ ceil(k/3));
    Gry_Img = imfilter(Image_noise,gausFilter);
    imshow(Gry_Img);title(num2str(sigma));
end

2.方法2

实验结果如下:
在这里插入图片描述
实验代码:

%% 文件说明
% 第三章数字图像处理作业第2次作业第2题做法2
% 要求:实现15*15的高斯低通模板
% 做法2:处理对比,不做边缘的高斯滤波滤波
%%
% 读取图像并作灰度化处理
srcImg=imread('pic_3_x2.jpg');
grayImg=rgb2gray(uint8(srcImg));
k = size(grayImg);
[grayImg_row,grayImg_col]=size(grayImg);
% 实现高斯模板参数设置
sigma = 1.6;      %sigma标准差
N = 7;            %模板大小为(2N+1)×(2N+1)= 15*15
N_row = 2*N+1;
N_col = 2*N+1;
% 对图像进行加噪处理
Image_noise = imnoise(grayImg,'gaussian'); %加噪

%% 使用按照高斯公式写的高斯滤波模板
G_ry = [];  % 根据高斯函数写的模板                                        
for i=1:N_row
    for j=1:N_col
        distance_s=double((i-N-1)^2+(j-N-1)^2);%像素距离
        G_ry(i,j)=exp(-distance_s/(2*sigma*sigma))/(2*pi*sigma*sigma);%高斯函数
    end
end
G_ry=G_ry/sum(G_ry(:));%归一化
 
dstImg_Gry = zeros(grayImg_row,grayImg_col); % 滤波后图像,大小与滤波前相同
for i=1:grayImg_row                           
    for j=1:grayImg_col
        dstImg_Gry(i,j)=Image_noise(i,j);
    end
end
 
temp=[];%滤波像素值
for ai=N+1:grayImg_row-N-1
    for aj=N+1:grayImg_col-N-1
        temp=0;
        for bi=1:N_row
            for bj=1:N_col
                % 注:这里是不对边界处理的滤波
                temp= temp+(dstImg_Gry(ai+bi-N-1,aj+bj-N-1)*G_ry(bi,bj));
            end
        end
        dstImg_Gry(ai,aj)=temp;
    end
end
% 滤波后的图像
dstImg_Gry=uint8(dstImg_Gry);
%% 使用matlab自带函数
gausFilter = fspecial('gaussian',[N_row N_col],sigma);     
GmF_Img=imfilter(Image_noise,gausFilter,'conv');%滤波后的图像

%% 显示滤波结果
figure('Name','不处理边界的高斯滤波对比')
subplot(2,2,1);imshow(grayImg);title('原图');
subplot(2,2,2);imshow(Image_noise);title('噪声图');
subplot(2,2,3);imshow(dstImg_Gry);title('my高斯滤波');
subplot(2,2,4);imshow(GmF_Img);title('matlab高斯滤波');

方法2和方法3可参考matlab实现图像滤波——高斯滤波【这篇博文

3.方法3

实验结果:
在这里插入图片描述
实验代码:

%% 文件说明
% 第三章数字图像处理作业第2次作业第2题做法3
% 要求:实现15*15的高斯低通模板
% 做法3:处理对比,边界扩充的高斯滤波滤波
%% 
% 读取图像并作灰度化处理
srcImg=imread('pic_3_x2.jpg');
grayImg=rgb2gray(uint8(srcImg));
[grayImg_row,grayImg_col]=size(grayImg);
% 实现高斯模板参数设置
sigma = 1.6;      %sigma标准差
N = 7;            %模板大小为(2N+1)×(2N+1)= 15*15
N_row = 2*N+1;
N_col = 2*N+1;

% 对图像进行加噪处理
Image_noise = imnoise(grayImg,'gaussian'); %加噪

%% 使用按照高斯公式写的高斯滤波模板
G_ry = []; % 根据高斯函数写的模板                                      
for i=1:N_row
    for j=1:N_col
        distance_s=double((i-N-1)^2+(j-N-1)^2);%像素距离
        G_ry(i,j)=exp(-distance_s/(2*sigma*sigma))/(2*pi*sigma*sigma);%高斯函数
    end
end
G_ry=G_ry/sum(G_ry(:));%归一化
 
dstImg_Gry = zeros(grayImg_row,grayImg_col); % 滤波后图像,大小与滤波前相同

midImg=zeros(grayImg_row+2*N,grayImg_col+2*N);    %滤波中间图像
for i=1:grayImg_row                           
    for j=1:grayImg_col
        midImg(i+N,j+N)=Image_noise(i,j);%原图像赋值给中间图像,四周边缘设置为0
    end
end
dstImg_ry=zeros(grayImg_row,grayImg_col);            %滤波后图像

temp=[];%滤波像素值
for ai=N+1:grayImg_row+N
    for aj=N+1:grayImg_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)*G_ry(bi,bj));
            end
        end
        dstImg_ry(temp_row,temp_col)=temp;
    end
end
dstImg_ry=uint8(dstImg_ry);

%% 使用matlab自带函数
gausFilter = fspecial('gaussian',[N_row N_col],sigma);     
GmF_Img=imfilter(Image_noise,gausFilter,'conv');%滤波后的图像

%% 显示结果
figure('Name','高斯滤波对比')
subplot(2,2,1);imshow(grayImg);title('原图');
subplot(2,2,2);imshow(Image_noise);title('噪声图');
subplot(2,2,3);imshow(dstImg_ry);title('my高斯滤波');
subplot(2,2,4);imshow(GmF_Img);title('matlab高斯滤波');

参考文献

  1. 高斯函数以及在图像处理中的应用总结 :/herenzhiming/articles/
  2. matlab实现图像滤波——高斯滤波:/ytang_/article/details/52749497