MATLAB使用傅里叶变换的方法消除图像中的黑色线条
2020-04-08
3 min read
本文将贴出MATLAB程序和输出结果以供参考。
clear;clf;
sourceImg=imread('bmp1.bmp');
img=rgb2gray(sourceImg);
[M,N]=size(img);
lineImg=img;
for i=300:306 %在第300~303行,第300~1000列生成一条黑色直线
for j=300:1000
lineImg(i,j)=0;
end
end
lineImgFFT=fft(lineImg,[],2); %进行FFT变换
linePosition=int8(zeros(M,1));
for i=1:M %遍历,找出长于10个像素的黑色(阈值为3)直线所在的行,存入linePosition里
findLine=false;
for j=1:N-10
if lineImg(i,j)<3
findLine=true;
for k=1:10
if lineImg(i,j+k)>=3
findLine=false;
end
end
if findLine==true
break;
end
end
end
if findLine==true
linePosition(i)=1;
end
end
for times=1:8 %重复多次,可以获得更好的结果。直线越粗,获得理想效果所需的次数越多。
for i=1:M
if linePosition(i)==1
for j=1:N
if i<=3 %如果在前三行,利用其后四行预测
lineImgFFT(i,j)=(lineImgFFT(i+1,j)*3+lineImgFFT(i+2,j)*2-lineImgFFT(i+3,j)*2-lineImgFFT(i+4,j))/2;
elseif i>=M-3 %如果在后三行,利用其前四行预测
lineImgFFT(i,j)=(lineImgFFT(i-1,j)*3+lineImgFFT(i-2,j)*2-lineImgFFT(i-3,j)*2-lineImgFFT(i-4,j))/2;
else %其余的用前后三行共六行预测
lineImgFFT(i,j)=(lineImgFFT(i+1,j)+lineImgFFT(i-1,j)+lineImgFFT(i+2,j)+lineImgFFT(i-2,j)+lineImgFFT(i+3,j)+lineImgFFT(i-3,j))/6;
end
end
end
end
end
fixedLineImg=ifft(lineImgFFT,[],2); %处理完之后进行FFT逆变换
figure(1);
subplot(1,2,1),imshow(lineImg),title('Image with line');
subplot(1,2,2),imshow(uint8(fixedLineImg)),title('Fixed image');
输出结果:
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。