matlab频域滤波
a) 横条纹:0_N_Girl_horiz_lines.bmp
该图像为512*512像素的8位灰度图。
观察图像特点,该图像包含周期性的白色条纹。
从第1像素行开始,每间隔9行像素点会有1行白色条纹。
因此构建两个临时的数组,其中一个为干扰条纹的灰度值,另一个为干扰条纹下侧正常点的灰度值。分别做傅里叶变换,对原图像进行滤波。
clear input=imread('0_N_Girl_horiz_lines.bmp'); figure,imshow(input); fft_old=fft2(input); fft_log=log(fftshift(abs(fft_old))); figure,imshow(fft_log,[]) horiz_lines_map=zeros(512,512); for n = 1:10:512 for m=1:512 horiz_lines_map(n,m)=double(input(n+1,m)); end end fft_hl_map=fft2(horiz_lines_map); horiz_lines=zeros(512,512); for n = 1:10:512 for m=1:512 horiz_lines(n,m)=double(input(n,m)); end end fft_hl=fft2(horiz_lines); fft_new=fft_old-fft_hl+fft_hl_map; fft_new_log=log(fftshift(abs(fft_new))); figure,imshow(fft_new_log,[]); ifft_new=ifft2(fft_new); figure,imshow(ifft_new,[]);
b) 特殊叠加条纹:1_N_Girl_Grad_lines.bmp
该图像为512*512像素的8位灰度图。
观察图像特点,该图像包含有规律的干扰条纹。
从第20像素行开始,每间隔i行像素点会有干扰条纹,且i逐渐增加1。
因此构建两个临时的数组,其中一个为干扰条纹的灰度值,另一个为干扰条纹周边正常点的灰度值。分别做傅里叶变换,对原图像进行滤波。
clear; input=imread('1_N_Girl_Grad_lines.bmp'); figure,imshow(input); fft_old=fft2(input); fft_log=log(fftshift(abs(fft_old))); figure,imshow(fft_log,[]) horiz_lines_map=zeros(512,512); a=-1; for i = 20:36 a=a+i; for j = 1:512 if rem(j-1,2)==0 horiz_lines_map(a+1,j)=(double(input(a+2,j))+double(input(a-1,j)))/2; horiz_lines_map(a,j)=(double(input(a+2,j))+double(input(a-1,j)))/2; else horiz_lines_map(a+1,j)=(double(input(a+3,j))+double(input(a,j)))/2; horiz_lines_map(a+2,j)=(double(input(a+3,j))+double(input(a,j)))/2; end end end fft_hl_map=fft2(horiz_lines_map); horiz_lines=zeros(512,512); a=-1; for i = 20:36 a=a+i; for j = 1:512 if rem(j-1,2)==0 horiz_lines(a+1,j)=double(input(a+1,j)); horiz_lines(a,j)=double(input(a,j)); else horiz_lines(a+1,j)=double(input(a+1,j)); horiz_lines(a+2,j)=double(input(a+2,j)); end end end fft_hl=fft2(horiz_lines); fft_new=fft_old-fft_hl+fft_hl_map; fft_rr_log=log(fftshift(abs(fft_new))); ifft_re=ifft2(fft_new); figure,imshow(fft_rr_log,[]); figure,imshow(ifft_re,[]);
c)干扰信号:2_lena_corrupt.bmp
该图像为512*512像素的8位灰度图。观察频域图可以发现,噪声集中于几个点中,可直接构建滤波器。
clear; I=imread('2_lena_corrupt.bmp'); figure,imshow(I) J = fft2(I); J = fftshift(J); figure,imshow(log(abs(J)),[]) for i=1:512 for j = 1:512 if(abs(J(i,j))>1200000)&(abs(J(i,j))<2500000)&~(((i>200)&(i<300))&((j>200)&j<300)) J(i,j)=0; end end end figure,imshow(log(abs(J)),[]) J = ifftshift(J); K = ifft2(J); figure,imshow(K,[0 255])