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('基于深度图的图像修复');