基于深度图像修复算法matlab实现:
clear all
close all
td = 10;
I=imread('color.bmp');
B=imread('depth.bmp');
B=rgb2gray(B);
subplot(121);imshow(I),title(' 原始受污染的图像 ') ;
[m,n,hh]=size(I);
A=rgb2gray(I);%彩色图转换灰度图
I1=I;
[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;%得到基点的相对坐标
depthpos=A(xstart:xend,ystart:yend)>10&abs(B(xstart:xend,ystart:yend)-basedepth)<td ; %参与加权的像素 td = 6且不能是受污染点
%此时加权系数d为1
[locind1,locind2]=find(depthpos);
W=(locind1-x1).*(locind1-x1)+(locind2-y1).*(locind2-y1);% 权值为距离平方的倒数
TT=1./W;
T=sum(TT);
% T = 1;
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
subplot(122),imshow(I1),title(' 基于深度图的图像修复 ')