图像处理系列:
空域滤波
这里根据模板是线性的还是非线性的进行分类,分别根据《图像处理与分析教程》上的方法实现了线性的领域平均、自定义加权平均、高斯平均、线性锐化和非线性的1-D中值滤波、2-D均值滤波、百分比滤波(最大、最小、中点)、非线性锐化、最大最小锐化,然后在主函数中进行测试。
一、线性滤波
1.空域线性滤波的代码
function [pic]=xxkylb(p,type,n,CX)
if nargin<3%缺省滤波核为3
n=3;
end
d=uint32(n/2)-1;%matlab uint会四舍五入!
if strcmp(type,'JZLB')%均值滤波器
K=ones(n,n);
K=uint32(K);
S=n*n;
elseif strcmp(type,'JQPJZDY')%自定义均值滤波器,滤波核由CX导入
K=CX;
K=uint32(K);
S=sum(K(:));
elseif strcmp(type,'GSJQPJ')%高斯均值滤波器
if nargin<4%缺省σ为1
sig=1;
else
sig=CX;
end
K=zeros(n,n);
gy=exp(double(-(((d)^2+(d)^2)/2*sig^2)))/(2*pi*sig^2);%右下角最小的参数,进行一个归一化
for x=1:n
for y=1:n
K(x,y)=exp(double((-(((x-d-1)^2+(y-d-1)^2)/2*sig^2))))/(2*pi*sig^2)/gy;%以距离值构造滤波核权术
end
end
K=uint32(K);%转换为整形
S=sum(K(:));
elseif strcmp(type,'RH')%线性锐化
K=CX;%模板为输入
S=1;%设为1
end
[r,c]=size(p);
mv=mean(p(:));
iob=ones(r+2*d,c+2*d)*mv;%以均值填充边缘,方便计算
iob((d+1):(d+r),(d+1):(d+c))=p;
pic=uint8(zeros(r,c));
for i=1:r
for j=1:c
t=0;
for k=1:n
for d=1:n
t=t+K(k,d)*iob(i+k-1,j+d-1);%计算
end
end
pic(i,j)=uint8(t/S);%换点
end
end
end
2.结果分析
a.线性空域滤波效果
测试代码
clear;clc
pic=imread('lena.BMP');
pic=rgb2gray(pic);
picJZ=xxkylb(pic,'JZLB');
a=[1 2 1;2 4 2;1 2 1];%一个自定义的均值模板
piczdy=xxkylb(pic,'JQPJZDY',3,a);
picGS=xxkylb(pic,'GSJQPJ');
b=[0 -1 0;-1 4 -1;0 -1 0];%一个自定义的锐化模板
picRH=xxkylb(pic,'RH',3,b);
figure(6)
set(gcf,'position',[100 100 1500 800]);
subplot(2,3,1)
imshow(pic)
xlabel('原图')
subplot(2,3,2)
imshow(picJZ)
xlabel('均值滤波')
subplot(2,3,3)
imshow(piczdy)
xlabel('自定义均值滤波')
subplot(2,3,4)
imshow(picGS)
xlabel('高斯滤波')
subplot(2,3,5)
imshow(picRH)
xlabel('线性锐化(3x3无边缘中心4对角-1)')%模板[0 -1 0;-1 4 -1;0 -1 0]
saveas(gcf,'线性空域滤波效果图.jpg')
效果图
图1 线性空域滤波效果图