基于深度图的图像修复------传统方法

图像修补一--------单幅图像修补

        图像中常有缺失或者损坏的部分,即空白区域或者有误的区域。图像修补就是根据这些区域周围的信息完成对空白区域进行填充,以实现图像恢复。

        方法:

基于深度图的图像修复------传统方法_第1张图片

        示例方法一:

        向空白点周围的八个方向寻找参考点,取距离二次方的倒数为加权系数。

基于深度图的图像修复------传统方法_第2张图片

       示例方法二:

        选取空白点周围的一片区域,对区域内的参考点进行加权求和,其结果用于对空白点的修补。若所选窗口太小,即窗口中无参考点,则将窗口扩大。

基于深度图的图像修复------传统方法_第3张图片

图像修补二--------利用深度图对图像进行修补

        1.图像前景与背景

        实际场景中存在前景与背景的区别,前景会遮挡背景,而且前景与背景的差距往往比较大。

        2.深度图

        用于表示3D空间中的点与成像平面距离的灰度图。0~255表示,灰度值越大,表示场景距离成像平面越近,反之,灰度值越小,表示场景距离成像平面越远。前景的灰度值大,背景的灰度值小。

        3.普通的图像修补不区分图像的前景与背景,简单的加权求和和填补空白点的方法会导致前景与背景的混杂。引入深度图之后,可以利用深度图区分图像的前景与背景,在对背景进行修补的时候,可以利用深度图滤除前景参考点的影响,从而使背景的空白点只由背景点加权求和得到,前景亦然。

基于深度图的图像修复------传统方法_第4张图片

步骤:1.读入一个像素点,判断其是否是空白点。

           2.若不是空白点,则跳过该点,判断下一个点。

           3.若该点是空白点,则用前面所描述的方法进行加权修补。

           4.对图像中的每一个点都进行如此处理,直至全图处理完毕,则图像修补完成。

%%C:\Users\yyong\Desktop\3D\impainting_depth.m
%利用深度图修补图像代码

clear all
close all

I = imread('pollutedim.bmp');
B = imread('depth.bmp');
B = rgb2gray(B);
imshow(I),title('原始受损图像')
[m,n,hh] = size(I);%m高,n宽,hhRGB三通道
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,终止行不能大于1
columnstart = columnind-20;columnend = columnind+20;%统计受污染像素模板起止列
columnstart(columnstart<1)=1;columnend(columnend>n)=n%起始行不能小于1,终止行不能大于1

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

实验结果

       原始受损图像:

基于深度图的图像修复------传统方法_第5张图片

        深度图:

基于深度图的图像修复------传统方法_第6张图片

         基于深度图修复结果:

基于深度图的图像修复------传统方法_第7张图片

 

 

你可能感兴趣的:(图像)