基于深度的图像修复实验分析报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于深度的图像修复实验报告
————————————————————————————————作者:————————————————————————————————日期:
2
基于深度的图像修复
一.实验目的
1、学会单幅图像的修补
2、学会结合彩色图像和深度图像的图像修补
二.实验原理
1图像修补简介----单幅图像修补
图像中常有缺失或者损坏的部分,即空白区域或者有误的区域。图像修补就是根据这些区域周围的信息完成对空白区域的填充,以实现图像的恢复。
基本方法
图像修补的基本方法示例
示例方法2
选取空白点周围的一片区域,对区域内的参考点进行加权求和,其结果用于对空白点的修补。若所选窗口太小,即窗口中无参考点,则将窗口扩大。
2图像修补简介----利用深度图的图像修补
1图像的前景与背景
实际场景中存在前景与背景的区别,前景会遮挡背景,而且前景与背景往往差距比较大。
2深度图
用于表示3D空间中的点与成像平面距离的灰度图。0~255表示,灰度值越大,表示场景距离成像平面越近,反之,灰度值越小,表示场景距离成像平面越远。
前景的灰度值大,背景的灰度值小。
如下左彩色图,右深度图
3普通的图像修补区分不了图像的前景和背景,简单的加权求和填补空白点的方法会导致前景和背景的混杂。引入深度图之后,可以利用深度图区分图像的前景和背景,在对背景进行修补的时候,可以利用深度图滤除那些前景参考点的影响,从而使背景的空白点只由背景点加权求和得到,前景亦然。
三.实验步骤
1读入一个像素点,判断其是否为空白点。
2若不是空白点,则跳过该点,判断下一个点。
3若该点是空白点,则用前面所述的方法进行加权修补。
4对图像中的每一个点都进行如此处理,直至全图处理完毕,则图像修补完成。
四.实验要求
1独立编码完成实验单幅图像修补利用深度图的图像修补。
2 比较实验结果的差别,并分析原因,完成实验报告。
五.用MATLAB编写实验代码
对于单幅图像以及结合深度图像的修补,其实区别就是是否考虑了深度图像的灰度权重(其实就是0和1),虽然效果图区别很小,但是通过深度图还是可以反映出其立体三维空间的。为了能较好的对比,我把两种方法的比较融合在一条件语句中,在下面的深度图像代码中用红色字体标注。同时深度图像变量用绿色字体标注。
那么要变成单幅图像的修补代码就很简单了,只要将条件语句depthpos=A(xstart:xend,ystart:yend)>3&abs(B(xstart:xend,ystart:yend)-basedepth)<6;
改为
depthpos=A(xstart:xend,ystart:yend)<3;即可
下面是完整的代码
利用深度图像的修补代码
clear all
close all
I=imread('pollutedim.bmp');
B=imread('depth.bmp');
B=rgb2gray(B);
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)>3&abs(B(xstart:xend,ystart:yend)-basedepth)<6;
%参与加权的像素与基准点相差小于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,imshow(I1),title('基于深度图的图像修复')
经过MATLAB运行后的单幅图像修补效果如下
利用彩色和深度图像的修补运行后的修补图如下