(做些小小更改,让变换结果更加清晰合理)(2021年1月1日17:36:36)
去除周期性波纹噪声最重要在于
1.频率域变换问题关键在于如何准确找到噪声点的位置。这里可以用类似矩阵扫描的方法找出某个点,其满足大于其上下左右各点的值(找到极大值点),同时满足大于某个阈值,我给定的是大于图像均值(中心点亮度)的4/5左右,即可确定准确的坐标位置。进而用巴特沃斯滤波进行处理。
2.确定合适的参数:截止半径r(相对于噪声点中心)。即自定义函数function d = findd0(coor,image)。大概是噪声中心到频谱图中心的距离,阈值:T,截止半径:R(相对于原点)
3.运用合适的滤波,对于不同的噪声用不同的滤波公式会有不同的效果,选择合适的滤波会有更好的效果。
功能函数代码部分:(matlab)
%频率域变换去除周期性噪声
function re = dpressnoise(img)
t1=myfft(img);%一维横向变换
f=myfft(t1.');%纵向变换
[m,n]=size(f);%获取傅里叶变换后频谱图的大小
[M,N]=size(img);%获取原来图像大小
f=myfftshift(f); %使图像对称,中心化
% r=real(f); %图像频域实部
% i=imag(f); %图像频域虚部
Margin=log(sqrt((real(f)).^2+(imag(f)).^2)); %图像幅度谱,加log便于显示
phase=real(angle(f)*180/pi); %图像相位谱
figure(1)
subplot(1,3,1),imshow(linear1(img)),title('源图像');%拉伸显示
subplot(1,3,2),imshow(Margin,[]),title('图像幅度谱');
subplot(1,3,3),imshow(phase,[]),title('图像相位谱');
T=5/6*max(max(Margin));%选取频谱图最亮点的5/6作为阈值,可以根据实际情况进行修改
R=10;%频谱图中心亮点及其周围亮点是影像图像亮度及信息不是噪声,设置一个截止半径,使得中心数据不被破坏
coor=[];%设置一个变量存储检测到的噪声点的坐标信息
for i=1:m-2
for j=1:n-2
if(Margin(i+1,j+1)>T&&sqrt((m/2-i)^2+(j-n/2)^2)>R&&Margin(i+1,j+1)>Margin(i+1,j)&&Margin(i+1,j+1)>Margin(i+1,j+2)&&Margin(i+1,j+1)>Margin(i,j+1)&&Margin(i+1,j+1)>Margin(i+2,j+1))
coor=[coor;i+1,j+1];
end
end
end
d0=findd0(coor,Margin);%计算每个噪声点对应到中心原点的距离
H=createH(d0,coor,Margin);%计算整个频谱图对应的滤波矩阵
f=f.*H;%将滤波矩阵与频谱图相乘
%逆变换
f=myfftshift(f);
g=myifft(f);
k=myifft(g.');
k=k(1:M,1:N);%截取原图像大小的图像,由于傅里叶变换中补零导致会出现黑色补零区域,现在剪裁掉
figure(2)
imshow(linear2(k)),%拉伸显示原图像
title('去噪处理结果')
re=k;
end
function H=createH(d0,coor,image)%创建H矩阵,coor指给定的噪声点中心坐标,image指频谱图像
count=size(coor,1);
[m,n]=size(image);
d=zeros(m,n,count/2);%申请矩阵
H=ones(m,n);
D0=zeros(count/2,1);
for i=1:m
for j=1:n
for k=1:count/2
d(i,j,k)=sqrt((i-coor(k,1))^2+(j-coor(k,2))^2)*sqrt((i-coor(count-k+1,1))^2+(j-coor(count-k+1,2))^2);
D0(k,1)=d0(k,1)^2;
end
for k=1:count/2
if(d(i,j,k)==0)
H(i,j)=0;
else
H(i,j)=H(i,j)/(1+(D0(k,1)/d(i,j,k))^2);
end
end
end
end
end
function d = findd0(coor,image)%根据给出的坐标大概确定截止半径,coor指给定的噪声点中心坐标
[M,N]=size(image);
k=size(coor,1);
dis=[];
for i=1:k%循环坐标个数
x=coor(i,1);%获取x坐标
y=coor(i,2);%获取y坐标
while(image(x,y+1)<image(x,y))%找出距最近的极小点
y=y+1;
end
dis=[dis;M/2+1-coor(i,1)];%算出距离保存
end
d=dis;
end
参考文献:
论文:图像线状和网格状噪声的去除方法
陶胜