基于Graph-Cut算法的彩色图像深度信息提取matlab仿真

发布时间 2023-05-20 12:43:22作者: 我爱C编程

1.算法仿真效果

matlab2022a仿真结果如下:

 

 

 

 

 

2.算法涉及理论知识概要

       Graph cuts是一种十分有用和流行的能量优化算法,在图像处理领域普遍应用于前后背景分割(Image segmentation)、立体视觉(stereo vision)、抠图(Image matting)等,目前在医学图像领域应用较多。

 

       Graph Cut(图形切割)应用于计算机视觉领域用来有效的解决各种低级计算机视觉问题,例如图像平滑(image smoothing)、立体应对问题(stereo correspondence problem)、图像分割(image segmentation)。

 

      GraphCut利用最小割最大流算法进行图像的分割,可以将图像分割为前景和背景。使用该算法时需要在前景和背景处各画几笔作为输入,算法将建立各个像素点与前景背景相似度的赋权图,并通过求解最小切割区分前景和背景。

 

     如果背景比较复杂或者背景和目标相似度很大,那分割就不太好了;二是速度有点慢。

 

     我们的目标是一种通用的交互式分割技术,将图像分为两部分:“对象”和“背景”。用户通过指示绝对必须是对象一部分的某些像素(种子)和必须是背景一部分的某些像素,对分割施加某些硬约束。直观地说,这些硬约束提供了用户打算分段的线索。

 

       Grab Cut只需要提供背景区域的像素集就可以了。也就是说你只需要框选目标,那么在方框外的像素全部当成背景

 

       此类方法把图像分割问题与图的最小割(min cut)问题相关联。首先用一个无向图G=<表示要分割的图像>VE分别是顶点(vertex)和变(edge)的集合。此处的Graph和普通的Graph稍有不同。普通的图由顶点和边构成,如果边的有方向的,这样的图被则称为有向图,否则为无向图,且边是有权值的,不同的边可以有不同的权值,分别代表不同的物理意义。而Graph Cuts图是在普通图的基础上多了2个顶点,这2个顶点分别用符号”S”和”T”表示,统称为终端顶点。其它所有的顶点都必须和这2个顶点相连形成边集合中的一部分。所以Graph Cuts中有两种顶点,也有两种边,见文章第一个图。

 

       第一种顶点和边:第一种普通顶点对应于图像中的每个像素。每两个邻域顶点(对应于图像中每两个邻域像素)的连接就是一条边。这种边也叫n-links

 

       第二种顶点和边:除图像像素外,还有另外两个终端顶点,叫Ssource:源点,取源头之意)和Tsink:汇点,取汇聚之意)。每个普通顶点和这2个终端顶点之间都有连接,组成第二种边。这种边也叫t-links

 

       每条边都有一个非负的权值We,也可以理解为cost(代价或者费用)。一个cut(割)就是图中边集合E的一个子集C,那这个割的cost(表示为|C|)就是边子集C的所有边的权值的总和。

 

       Graph Cuts中的Cuts是指这样一个边的集合,很显然这些边集合包括了上面2种边,该集合中所有边的断开会导致残留”S”和”T”图的分开,所以就称为“割”。如果一个割,它的边的所有权值之和最小,那么这个就称为最小割,也就是图割的结果。而福特-富克森定理表明,网路的最大流max flow与最小割min cut相等(证明可参见最大流与最小割)。所以由BoykovKolmogorov发明的max-flow/min-cut算法就可以用来获得s-t图的最小割。这个最小割把图的顶点划分为两个不相交的子集ST,其中s StTST=V 。这两个子集就对应于图像的前景像素集和背景像素集,那就相当于完成了图像分割。

 

也就是说图中边的权值就决定了最后的分割结果,那么这些边的权值怎么确定呢?

 

       图像分割可以看成pixel labeling(像素标记)问题,目标(s-node)的label设为1,背景(t-node)的label设为0,这个过程可以通过最小化图割来最小化能量函数得到。那很明显,发生在目标和背景的边界处的cut就是我们想要的(相当于把图像中背景和目标连接的地方割开,那就相当于把其分割了)。同时,这时候能量也应该是最小的。假设整幅图像的标签label(每个像素的label)为L= {l1,l2,,,, lp },其中li0(背景)或者1(目标)。那假设图像的分割为L时,图像的能量可以表示为:

 

E(L) = aR(L) + B(L)

 

       其中,R(L)为区域项(regional term),B(L)为边界平滑项(boundary term),而a就是区域项和边界项之间的重要因子,决定它们对能量的影响大小。如果a0,那么就只考虑边界因素,不考虑区域因素。E(L)表示的是权值,即损失函数,也叫能量函数,图割的目标就是优化能量函数使其值达到最小。

 

 

 

 

 

3.MATLAB核心程序

 

clc;
clear;
close all;
warning off;
addpath(genpath(pwd));
 
 
imName = '模糊样本\1.bmp';       
I = imread(imName);
I = im2double(imresize(I,500/max(size(I,1),size(I,2))));I(I>1)=1;I(I<0)=0;
LL= 1.1;
 
[T, A, Cache] = Lee_EnergyMinimization_Dehazing(I,LL);
 
figure;
subplot(121)
imshow(I);
title('原始图像');
subplot(122)
imshow(T);
title('提取深度信息');
 
 
imName = '模糊样本\2.bmp';       
I = imread(imName);
I = im2double(imresize(I,500/max(size(I,1),size(I,2))));I(I>1)=1;I(I<0)=0;
 
 
[T, A, Cache] = Lee_EnergyMinimization_Dehazing(I,LL);
 
figure;
subplot(121)
imshow(I);
title('原始图像');
subplot(122)
imshow(T);
title('提取深度信息');