MATLAB使用傅里叶变换的方法消除图像中的黑色线条

本文将贴出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');

输出结果:
GReokt.png


知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

Creative Commons License