www.gusucode.com > 基于matlab编程深度图的图像修复源码程序 > 基于matlab编程深度图的图像修复源码程序/深度图像修补/main.m

    clear all
close all

I=imread('color.bmp');
B=imread('depth.bmp');
B=rgb2gray(B);
[m,n,hh]=size(I);
A=rgb2gray(I);%彩色图转换灰度图
I1=I;
figure(1),imshow(I);title('原始受污染的图像');
figure(2),imshow(B);title('深度图');
figure(3),imshow(A);title('灰度图');

[rowind,columnind]=find(A<4);%灰度图中小于4灰度值的认为是受到污染的像素,统计受污染像素的位置,rowind和columnind均是向量,并且两者一一对应组成位置坐标
pointnum=length(rowind);%受污染像素的个数

rowstart=rowind-20;rowend=rowind+20;%统计每个受污染像素修复模板的起止行
rowstart(rowstart<1)=1;rowend(rowend>m)=m;%起始行不能小于1,终止行不能大于m

columnstart=columnind-20;columnend=columnind+20;%统计模板的起,止列
columnstart(columnstart<1)=1;columnend(columnend>n)=n;%以基准点(受污染点)为中心41*41模板

for num=1:pointnum%对每个受污染的像素进行修复
    x=rowind(num);
    y=columnind(num);
    basedepth=B(x,y);%深度图基准点灰度值
    
    xstart=rowstart(num);
    xend=rowend(num);
    x1=x-xstart+1;%得到基点的相对坐标
    
    ystart=columnstart(num);
    yend=columnend(num);
    y1=y-ystart+1;%得到基点的相对坐标 
    %Td=7
    depthpos=A(xstart:xend,ystart:yend)>3&abs(B(xstart:xend,ystart:yend)-basedepth)<7;%参与加权的像素在深度图上与基准点相差小于6且不能是受污染点
    [locind1,locind2]=find(depthpos);
    W=(locind1-x1).*(locind1-x1)+(locind2-y1).*(locind2-y1);%权值为距离平方的倒数
    TT=1./W;T=sum(TT);
    Aloc=I(xstart:xend,ystart:yend,1);%对红色通道进行处理
    Aloc=double(Aloc(depthpos));
    R=Aloc.*TT;R=sum(R);
    I1(x,y,1)=R/T;
    
    Aloc=I(xstart:xend,ystart:yend,2);%对绿色通道进行处理
    Aloc=double(Aloc(depthpos));
    R=Aloc.*TT;R=sum(R);
    I1(x,y,2)=R/T;
    
    Aloc=I(xstart:xend,ystart:yend,3);%对蓝色通道进行处理
    Aloc=double(Aloc(depthpos));
    R=Aloc.*TT;R=sum(R);
    I1(x,y,3)=R/T;
end
figure(4),imshow(I1);title('基于深度图的图像修复');