要求是:自适应中值滤波器和自适应均值滤波器的设计,分别使用python和matlab去实现
一.原理
1.自适应中值滤波器
2.自适应局部滤波器,也叫自适应均值滤波器
二.设计流程
1.自适应中值滤波器
①生成椒盐噪声
利用rand()函数生成[0,1]的随机数,将随机数作逻辑判断,小于n值(n为椒盐密度)的为逻辑1,其余为逻辑0,再将这些逻辑值通过逻辑与、非等操作赋予像素点0或255值,得到椒盐噪声。
②设计中值滤波
中值滤波器的设计过程为:取出当前n*n阶滤波器对应的像素点,对其中像素作排序,取出中位数,赋予当前的中间位置像素点,放至结果矩阵中,输出。
③设计自适应中值滤波器
设计过程:以整个矩阵为整体进行操作。取出当前的n阶像素点,取出中位数、最小值、最大值并存储到新矩阵。将这三个新矩阵进行自适应中值滤波器的A、B过程的比较,并按照要求将符合的结果放至结果矩阵中,输出。
2.自适应局部滤波器
①生成高斯噪声
按照上次作业的原理设计出高斯噪声,并添加到原图像中。
②设计均值滤波器
设计过程为:取出当前n*n阶滤波器对应的像素点,求其均值,并将结果放至结果矩阵中,输出。
③设计自适应均值滤波器
设计过程为:求噪声方差;以矩阵为整体运算,求出n阶滤波器对应的像素点像素的均值,方差;将局部方差与噪声方差进行比较,按照规则计算新的像素,并存在结果矩阵中,输出。
三.MATLAB代码
①自适应中值滤波器,对灰度图像进行处理
%自适应中值滤波器,对灰度图像进行处理
function output=adp_median(image,nmin,nmax)
%输入为:image原图像,nmin滤波器的最小阶数,nmax滤波器的最大阶数
%image=rgb2gray(image); %灰度图像
%image=imnoise(image,'salt & pepper',0.5);
[h,w,~]=size(image);
imaged=double(image);
imagedd=imaged;
imagemid=imaged;
imagemin=imaged;
imagemax=imaged;
for k=nmin:2:nmax
for i=1:h-k+1
for j=1:w-k+1
pattern=imaged(i:i+k-1,j:j+k-1); %取出n*n的像素点值
patterns=reshape(pattern,1,length(pattern(:))); %将n*n矩阵转换为行向量
middle=median(patterns); %对行向量取中位数
mini=min(patterns); %对行向量取最小值
maxi=max(patterns);%对行向量取最大值
imagemid(i+(k-1)/2,j+(k-1)/2)=middle;
imagemin(i+(k-1)/2,j+(k-1)/2)=mini;
imagemax(i+(k-1)/2,j+(k-1)/2)=maxi;
end
end
pa=(imagemax>imagemid)&(imagemid>imagemin);%A步骤的判断(对整个矩阵判断)
pb=(image>imagemin)&(imagemax>image);%B步骤的判断
zxy=pa&pb; %满足A,B条件的记在zxy位置
zmed=pa&~pb;%满足A条件,不满足B条件的记在zmed位置
imagedd(zxy)=image(zxy);%输出zxy
imagedd(zmed)=imagemid(zmed);%输出zmed
if k==nmax %超过最大窗口尺寸的,输出zmed
zmedd=~pa;
imagedd(zmedd)=imagemid(zmedd);
end
end
imagedd=uint8(imagedd); %转换为图片格式
output=imagedd;%输出
End
②自适应中值滤波器,对彩图进行处理
%自编写自适应中值滤波器处理三通道彩色图像
function output=adpmedian(image,nmin,nmax)
[h,w,~]=size(image);
imaged=double(image);
imaged1=imaged(:,:,1);
imaged2=imaged(:,:,2);
imaged3=imaged(:,:,3);
imagedd=imaged;
imagedd1=imaged(:,:,1);
imagedd2=imaged(:,:,2);
imagedd3=imaged(:,:,3);
imagemid=imaged;
imagemid1=imaged(:,:,1);
imagemid2=imaged(:,:,2);
imagemid3=imaged(:,:,3);
imagemin=imaged;
imagemin1=imaged(:,:,1);
imagemin2=imaged(:,:,2);
imagemin3=imaged(:,:,3);
imagemax=imaged;
imagemax1=imaged(:,:,1);
imagemax2=imaged(:,:,2);
imagemax3=imaged(:,:,3);
alreadyProcessed1=false(size(imaged1));
alreadyProcessed2=false(size(imaged2));
alreadyProcessed3=false(size(imaged3));
for k=nmin:2:nmax
for i=1:h-k+1
for j=1:w-k+1
pattern1=imaged1(i:i+k-1,j:j+k-1); %取出n*n的像素点值
pattern2=imaged2