(MATLAB)空间周期性噪声的一种通用处理方法
本文的目的在于处理图像中出现的周期性噪声,使用的语言是MATLAB
常见的结构有线状周期性结构,蜂窝状周期性结构等,总而言之,图像中出现了某种结构并这种结构在图像中重复出现,这样的周期性结构会对图像的原有信息或者图像质量产生影响。为了能够使算法对各种周期性噪声具有处理通用性,算法中构建频域滤波器时是需要交互式构建,
本文的整体处理思路是:
- 将图像变换到频域空间;
- 通过交互方式构建频域滤波器,在频域将周期性结构产生的频率局部极值去除;
- 将去除之后的图像频域反变换到空间;
以下我们以去除下图中的蜂窝状结构为例,讲解本文去除周期结构的通用方法
1、 处理原理
空间的周期性结构在频域会在周期性重复方向的垂直方向上产生布局极值
视频演示
为了对本文算法流程有一个直观的认识,先放上本文处理算法的视频演示
一种频域处理周期性噪声的通用方法
视频链接:https://www.bilibili.com/video/BV1kt4y1k7Cm/
以下是视频处理的具体流程:
- 第一步:读取图像,在灰度域上显示图像的频域信息;
- 第二步:输入你想要去除频域区域的个数num;
- 第三步:通过imellipse函数,选取想要去除的频域区域,在选取区域,滤* 波器数值为0,其他区域为1;
- 第四步:通过分别对RGB三通道频域滤波,恢复到空域,将三通道合并,并* 将处理结果显示出来;
- 第五步:重复第三步和第四步,知道已经选取要去除的区域个数大于等于num;
- 第六步:保存图像
2、代码实现
1、选择图片
clear; close all;
[filename, pathname] = uigetfile({ '所有文件'(*.*)' }, '选择图片');
img_I = imread([pathname, filename]);
2、在灰度域上显示频域
img_gray = rgb2gray(img_I);
fI=fft2(img_gray);
fcI=fftshift(fI);
fmI=log(abs(fcI));
3、 判断要去除频域区域个数
UfmI=fmI;
figure(2),imshow(UfmI,[])
prompt = '通过观察图像频域,选择想要去除的频域区域个数'
num = input(prompt);
%滤波函数初始化
[M,N] = size(fmI);
i=1;
window = ones(M,N);
4、循环实时处理RGB通道
while (i<=num)
figure(2),imshow(UfmI,[]); %显示原图像
hold on
title(['\fontsize{16}通过画矩形去除你想要去除的频率(还剩',num2str(num+1-i),'个区域)']);
set(gcf,'outerposition',0.8*get(0,'screensize'));
% h=imrect; %鼠标变成十字,用来选取感兴趣区域
h=imellipse;
pos=getPosition(h); %图中就会出现可以拖动以及改变大小的矩形框,获取选好的位置
x1=ceil(pos(1)); %获取矩形的对角坐标
x2=ceil(pos(1))+ceil(pos(3));
midx = (x1+x2)/2;
y1=ceil(pos(2));
y2=ceil(pos(2))+ceil(pos(4));
midy = (y1+y2)/2;
%画出要构建的频率选择器
for x=1:N
for y=1:M
if x>=x1&&x<=x2&&y>=y1&&y<=y2
dis = sqrt((x-midx)^2+(y-midy)^2);
if dis<=min(abs(y1-midy),abs(x1-midx))
window(y,x) = 0;%要去除的窗口设置为零
end
%
end
end
end
UfmI = UfmI.*window;
img_R = img_I(:,:,1);
img_G = img_I(:,:,2);
img_B = img_I(:,:,3);
%处理R通道
fI=fft2(img_R);
fcI=fftshift(fI);
fcI_out= fcI .* window; % 原图像频谱乘以绘制的频率选择器
fI_out=ifftshift(fcI_out);
img_outR = ifft2(fI_out); % 变换回空域
%处理G通道
fI=fft2(img_G);
fcI=fftshift(fI);
fcI_out= fcI .* window; % 原图像频谱乘以绘制的频率选择器
fI_out=ifftshift(fcI_out);
img_outG = ifft2(fI_out); % 变换回空域
%处理B通道
fI=fft2(img_B);
fcI=fftshift(fI);
fcI_out= fcI .* window; % 原图像频谱乘以绘制的频率选择器
fI_out=ifftshift(fcI_out);
img_outB = ifft2(fI_out); % 变换回空域
result = cat(3,uint8(abs(img_outR)),uint8(abs(img_outG)),uint8(abs(img_outB)));
figure(3),subplot(1,2,2),imshow(result); title(['\fontsize{16}实时处理后图像显示']);
subplot(1,2,1),imshow(UfmI,[]) ,title( ['\fontsize{16}滤波后频域']);
i=i+1;
end
5、保存图像
[filename,pathname]=uiputfile('All Files(*.*)''请输入保存图像名字');
pathfile=[pathname filename];
imwrite(result,pathfile,'jpg');
3、总结
空间周期性结构在频域上会出现局部极大值,并且符合:
其中T是空间周期结构的重复周期,会在频域f处产生较大的值;
本文中处理图像中,周期性结构是一个类似于正六边形的结构,所以在空间上可以看成是六个边在空间重复,因此这样的噪声会在频域产生一个正六边形的亮点,理解了周期结构对频域的影响,就可以有效构建去除周期性噪声结构相应的频域,进而去除空域中的噪声。
4、后续
1、其他方法
①简单对空域进行低通滤波也可以去除周期性噪声,但是有两个缺点:
- 由于去除掉了原有非噪声的高频,得到的图像过于平滑;
- 对于空间周期较大的结构,处理效果不佳;
②采用带通滤波器不能适应每种周期性结构噪声;
2、多多指教
学习图像处理不久,以上仅是自己的一点小小看法,希望各位大佬多多指教!大家觉得不错就点个赞吧!
**文件链接:https://pan.baidu.com/s/1sU5V3gCCZkThNstu_ke8PQ 提取码: 67tw **