本算法是修复图像的黑白线条。局限性在于:只能修复些白(黑)色的线条。白(黑)色是因为模板中像素值在范围245以上或10以下;线条是因为修复算法中用的整块求均值的思想。试了下剩下的情况都不是很理想:换成其他像素值就直接略过,如果线条变粗可以修复,但是很模糊了。
废话少说,上图上代码,希望有研究图像的同学能够解答下非线条和中间像素的修复方法。个人感觉应该用模板解决吧?谢~(注:以下均为matlab代码,额,osc啊,为什么没有matlab代码的语法标记...)
clc
clear all;
R=imread('lena2.bmp');
R=double(R);
[nrow ncol]=size(R);
mask=zeros(nrow,ncol);
for i=1:nrow
for j=1:ncol
if R(i,j)>250
mask(i,j)=1;
end
end
end
I=R;
T=200;
for n=1:T
for i=1:nrow
for j=1:ncol
if mask(i,j)==1
[iis,jjs]=getinds(i,j,1,nrow,ncol);
le=length(iis);
for k=1:le
ii=iis(k);
jj=jjs(k);
tp(k)=I(ii,jj);
tp=tp(1:le);
I(i,j)=mean(tp);
end
end
end
end
% figure;imshow(uint8(R));
% figure;imshow(mask);
% figure;imshow(uint8(I));
I=uint8(I);
imwrite(I,'Fixed_lena.bmp');
function [iis,jjs]=getinds(i,j,d,m2,n2);
ind1=i-d;
ind2=i+d;
ind3=j-d;
ind4=j+d;
ind11=max(1,ind1);
ind22=min(m2,ind2);
ind33=max(1,ind3);
ind44=min(n2,ind4);
iis=[];
jjs=[];
if ind1>=1
le=ind44-ind33+1;
tp=ones(1,le)*ind11;
iis=cat(2,iis,tp);
jjs=cat(2,jjs,ind33:ind44);
end
if ind2<=m2
le=ind44-ind33+1;
tp=ones(1,le)*ind22;
iis=cat(2,iis,tp);
jjs=cat(2,jjs,ind33:ind44);
end
if ind3>=1
iis=cat(2,iis,ind11+1:ind22-1);
le=ind22-ind11-1;
tp=ones(1,le)*ind33;
jjs=cat(2,jjs,tp);
end
if ind4<=n2
iis=cat(2,iis,ind11+1:ind22-1);
le=ind22-ind11-1;
tp=ones(1,le)*ind44;
jjs=cat(2,jjs,tp);
end
图1:破坏的图片 图2:修复的图片