首页 > 编程语言 >基于Graph-Cut算法的彩色图像深度信息提取matlab仿真

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

时间:2023-05-20 13:01:37浏览次数:39  
标签:分割 Cut Graph 信息提取 像素 图像 顶点 背景

1.算法仿真效果 matlab2022a仿真结果如下:

2.png1.png

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3.MATLAB核心程序

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('提取深度信息');

标签:分割,Cut,Graph,信息提取,像素,图像,顶点,背景
From: https://blog.51cto.com/matworld/6317468

相关文章

  • 基于Graph-Cut算法的彩色图像深度信息提取matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:     2.算法涉及理论知识概要       Graphcuts是一种十分有用和流行的能量优化算法,在图像处理领域普遍应用于前后背景分割(Imagesegmentation)、立体视觉(stereovision)、抠图(Imagematting)等,目前在医学图像领域应用较......
  • API架构的选择,RESTful、GraphQL还是gRPC
    hi,我是熵减,见字如面。在现代的软件工程中,微服务或在客户端与服务端之间的信息传递的方式,比较常见的有三种架构设计的风格:RESTful、GraphQL和gRPC。每一种模式,都有其特点和合适的使用场景,今天,我们主要来对三种风格做一个深入的理解和对比,以方便我们在做技术选型时,能够做出有效的......
  • Spring Could not find unique TaskExecutor bean 错误
    这个错误其实是debug级别的错误,是不影响运行的。错误栈为:15:27:57.726DEBUG12844---[nio-8080-exec-1].s.a.AnnotationAsyncExecutionInterceptor:CouldnotfinduniqueTaskExecutorbeanorg.springframework.beans.factory.NoUniqueBeanDefinitionException:Noqu......
  • SUBLEX - Lexicographical Substring Search
    来一发\(SA\)做法。题目见SUBLEX-LexicographicalSubstringSearch从P2408不同子串个数当中找到的灵感,统计不同子串个数时候,实际上是用总串数减去重复的串数。那么针对这道题,查找排名第\(k\)小的串,想想我们的后缀数组,不正是满足字典序从小到大排列?现在我们已经拥有......
  • 全网最详细解读《GIN-HOW POWERFUL ARE GRAPH NEURAL NETWORKS》!!!
    Abstract+IntroductionGNNs大都遵循一个递归邻居聚合的方法,经过k次迭代聚合,一个节点所表征的特征向量能够捕捉到距离其k-hop邻域的邻居节点的特征,然后还可以通过pooling获取到整个图的表征(比如将所有节点的表征向量相加后用于表示一个图表征向量)。关于邻居聚合策略以及......
  • 图数据库 NebulaGraph 的内存管理实践之 Memory Tracker
    数据库的内存管理是数据库内核设计中的重要模块,内存的可度量、可管控是数据库稳定性的重要保障。同样的,内存管理对图数据库NebulaGraph也至关重要。图数据库的多度关联查询特性,往往使图数据库执行层对内存的需求量巨大。本文主要介绍NebulaGraphv3.4版本中引入的新特性Mem......
  • NVRM: Xid (PCI:0000:b1:00): 13, pid=1375637, Graphics SM Global Exception on (GP
    显卡服务器中一个显卡崩溃了:May1605:38:58dellkernel:[14244871.006970]NVRM:Xid(PCI:0000:b1:00):13,pid=1375637,GraphicsSMWarpExceptionon(GPC0,TPC0,SM0):IllegalInstructionEncodingMay1605:38:58dellkernel:[14244871.010256]NVRM:Xid(PC......
  • ThreadPoolTaskExecutor与ThreadPoolExecutor的区别及优缺点
    ThreadPoolTaskExecutor和ThreadPoolExecutor都是线程池的实现,但它们有以下几点区别:1.ThreadPoolTaskExecutor是Spring框架中编写的,它对ThreadPoolExecutor进行了封装,提供了更加丰富的功能,更易于在Spring中使用。而ThreadPoolExecutor是JDK中的实现。2.ThreadPoolTaskExe......
  • Understanding Structural Vulnerability in Graph Convolutional Networks
    目录概符号说明本文的方法代码ChenL.,LiJ.,PengQ.,LiuY.,ZhengZ.andYangC.Understandingstructuralvulnerabilityingraphconvolutionalnetworks.IJCAI,2021.概mean是在GCN中是一种常见的aggregation方式,但是作者认为这种方式是不鲁棒的,很容易......
  • Python数据离散化指南:手写if-elif语句与pandas中cut()方法的实现
    当我们进行数据分析时,有时候需要对数值型数据进行离散化,将其划分为不同的标签或类别。这样做可以方便我们进行统计和分析,并帮助我们更好地理解数据。在本文中,我们将介绍两种常见的离散化方法,并提供实现代码。方法一:使用条件语句第一种方法是使用条件语句来显式地检查输入值x......