自定义二维卷积函数与高斯核,图像平滑处理

高斯核函数

function [ output1,output2,output3,output4 ] = gaussKernel(sig,m)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  gaussKernel():归一化二维高斯滤波核函数
%  sig 对应于高斯函数定义中的σ
%  w 的大小为 m×m 其中m必须为奇数
%output1:从高斯函数采样得到的模板
%output2:模板除以第一个元素
%output1:取整后的模板
%output1:归一化后的模板
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 if(nargin<2)                             %为给定m值则求取m
     m = ceil(3*sig)*2 + 1;               %求m值
 end
 if(rem(m,2)==0)                          %判断m值是否为偶数
    warning('m值不能为偶数,请重新输入...') 
    return                                 %m值为偶数则终止程序
 end
 output1 = zeros(m,m);                     %初始化输出矩阵
for i = 1:m
    for j = 1:m
        %%%  循环操作,依次计算卷积核每一个值   %%%
        output1(i,j) = exp(-(  (i-(m+1)/2)^2+(j-(m+1)/2)^2  )/2/sig/sig);
    end
end 
output2 =  output1 / output1(1,1);         %除以左上角第一个元素
output3 = floor(output2);                  %取整
output4 = output2/(sum(sum(output3,1),2)); %归一化
end

二维卷积函数

function [ output ] =  twodConv(f, w , padding)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  twodConv()函数实现图像的二维卷积
%  f 是一个灰度源图像
%  w 是一个矩形卷积核
%  padding表示填充方式 'replicate''zero'两种方式
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 w1 = rot90(w,2);                       %对卷积核进行旋转
 [wx,wy]=size(w1);                      %求w1矩阵的大小
 [fx,fy]=size(f);                       %求f矩阵的大小
 Paddingf = zeros(fx+wx-1,fy+wy-1);     %初始化填充图像矩阵
                                        %将原图矩阵覆盖至填充图像矩阵相应位置
 Paddingf((wx+1)/2:(wx+1)/2+fx-1,(wy+1)/2:(wy+1)/2+fy-1)=f(:,:);
 if(nargin<3)||strcmp(padding,'zero')  %采用默认方式或者'zero'方式
                                       %采用if语句外的零填充 这里不执行任何语句
 elseif strcmp(padding,'replicate')    %采用'replicate'方式
     for t = 1:(wx-1)/2                %上下边界填充
         Paddingf(t,:) = Paddingf((wx+1)/2,:);
         Paddingf(fx+wx-t,:) = Paddingf(fx+wx-1-(wx-1)/2,:);
     end
     for t = 1:(wy-1)/2                %左右边界填充
         Paddingf(:,t) = Paddingf(:,(wy+1)/2);
         Paddingf(:,fy+wy-t) = Paddingf(:,fy+wy-1-(wy-1)/2);
     end
 end
 output=zeros(fx,fy);                  %初始化卷积图像矩阵
 for i = (wx+1)/2:(wx+1)/2+fx-1        %循环计算卷积
     for j = (wy+1)/2:(wy+1)/2+fy-1
                                       %逐个点计算卷积 并赋值给卷积图像矩阵
        output(i-(wx-1)/2,j-(wy-1)/2) = sum(sum(Paddingf(i-(wx-1)/2:i+(wx-1)/2,j-(wy-1)/2:j+(wy-1)/2).*w1,2),1);
     end
 end

end

测试

主文件

Img1 = imread('图1.tif');              % 读取图片数据
%%%%%%   生成高斯核并进行滤波  %%%%%%%
[Kernel1,Kernel2,Kernel3,Kernel4] = gaussKernel(1.2,5)
Img1_GaussFilter = twodConv(Img1, Kernel4 , 'replicate');
figure(1)                             
subplot(1,2,1)                         %分割绘图区域
imshow(Img1,[])                        %显示原图
title('图一.tif—原图')                 %添加标题
subplot(1,2,2)                         %分割绘图区域
imshow(Img1_GaussFilter,[])            %显示滤波后的图
title('图一.tif—高斯滤波图像')          %添加标题
说明:图像随便弄一张

结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44231148/article/details/107618361