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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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运行后的单幅图像修补效果如下

利用彩色和深度图像的修补运行后的修补图如下

相关文档
最新文档