简单图像修复,还有问题求解答

    本算法是修复图像的黑白线条。局限性在于:只能修复些白(黑)色的线条。白(黑)色是因为模板中像素值在范围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:修复的图片

转载于:https://my.oschina.net/zerrys/blog/134185

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值