当前位置:文档之家› 基于深度的图像修复实验分析报告

基于深度的图像修复实验分析报告

基于深度的图像修复实验报告
————————————————————————————————作者:————————————————————————————————日期:
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运行后的单幅图像修补效果如下
利用彩色和深度图像的修补运行后的修补图如下
六、实验结果分析
两幅图像对原缺失图像有了很大的修正,而且都得到了不错的效果,至少从整体看上去与缺失图像不可同日而语。

但是通过比较单幅图像修补结果与深度图像修补结果还是不难发现其中的一些细微的差别。

其中最明显的对是空白区的填补有非常大的差距,由于深度图考虑了其中的三维立体结构,所以对填补的空白点改变的非常彻底,但是在单幅图像修补中相对很宽的空白区域,修补后的效果是一种渐变的过程。

就是说填补的空白区域受边缘的影响非常之大,这就是因为普通的图像修补区分不了图像的前景和背景,简单的加权求和填补空白点的方法会导致前景和背景的混杂。

而引入深度图之后,可以利用深度图区分图像的前景和背景,在对背景进行修补的时候,可以利用深度
图滤除那些前景参考点的影响,从而使背景的空白点只由背景点加权求和得到,前景亦然。

所以总的来说,两种修补方法都不错,但结合深度图像的修补显得更真实,更符合客观的要求一些。

唯一的缺陷就是运算次数要多一些,不过相差也不是很大。

相关主题