高斯核函数
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—高斯滤波图像') %添加标题
说明:图像随便弄一张
结果