clc;
clear all;
img=im2double(imread('D:\Gray Files\3-33.tif'));
KernelSize=43;
Kernel_Type='square root kernel';
%扩展区域的行列数
len=floor(KernelSize/2);
%对原始图像进行扩展,此处采用了镜像扩展,目的是解决边缘计算的问题
img_pad=padarray(img,[len,len],'symmetric');
[M,N]=size(img_pad);
switch Kernel_Type
%box kenal,均值内核(滤波器)
case 'box kernel'
%内核掩模(滤波器)、权重矩阵
W=ones(KernelSize,KernelSize)/KernelSize^2;
%加权平均核函数
case 'weighted kernel'
%求解初期构造矩阵的大小
m=(KernelSize+1)/2;
for i=1:m
for j=1:m
w1(i,j)=2^(i+j-2);
end
end
%对w1水平翻转,然后合并w1,w2,同时要删除中间重合的两列
w2=fliplr(w1);
w3=cat(2,w1(:,1:m-1),w2);
%对w3垂直翻转,然后合并w3,w4,同时删除中间重复的两行
w4=flipud(w3);
W=cat(1,w3(1:m-1,:),w4);
W=W/(sum(sum(W)));
%平方根核函数
case 'square root kernel'
K=1;
delta=7;
m=(KernelSize+1)/2;
%生成第一列数据
w1=zeros(m,m);
for i=2:m
w1(i,1)=sqrt(w1(i-1,1)+2*(i-1)-1);
end
%生成剩余列的数据
for i=1:m
for j=2:m
w1(i,j)=sqrt((w1(i,j-1))^2+2*(j-1)-1);
end
end
%对w1水平翻转,然后合并w1,w2,同时要删除中间重合的两列
w2=fliplr(w1);
w3=cat(2,w2(:,1:m-1),w1);
%对w3垂直翻转,然后合并w3,w4,同时删除中间重复的两行
w4=flipud(w3);
W=cat(1,w4(1:m-1,:),w3);
W=K*exp(-W.^2/(2*delta^2));
W=W/(sum(sum(W)));
end
g=img;
for i=1+len:M-len
for j=1+len:N-len
%从扩展图像中,取出局部图像
Block=img_pad(i-len:i+len,j-len:j+len);
%计算局部图像与内核掩模(滤波器)的乘积
g(i-len,j-len)=sum(sum(Block.*W));
end
end
imshow(g);
title('平滑滤波');