python--图像分割GraphCut

分割的原则就是使划分后的子图在内部保持相似度最大,而子图之间的相似度保持最小。
以一个两类的分割为例,把G = (V,E) 分成两个子集A,B,另: A\cup B=V,A\cap B=\phi ,CUT(A,B) = \Sigma_{\mu\in A,v\in B}w(\mu,v) , 其中 w(\mu,v) , 是权重(weight), 最小割就是让上式的值最小的分割。
在这里插入图片描述

GraphCut

该方法把图像分割问题与图的最小割(min cut)问题相关联。

首先用一个无向图G=<V,E>表示要分割的图像,V和E分别是顶点(vertex)和边(edge)的集合。

此处的Graph和普通的Graph稍有不同。普通的图由顶点和边构成,如果边的有方向的,这样的图被则称为有向图,否则为无向图,且边是有权值的,不同的边可以有不同的权值,分别代表不同的物理意义。

而Graph Cuts图是在普通图的基础上多了2个顶点,这2个顶点分别用符号”S”和”T”表示,统称为终端顶点。其它所有的顶点都必须和这2个顶点相连形成边集合中的一部分。所以Graph Cuts中有两种顶点,也有两种边。

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

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

上图就是一个图像对应的s-t图,每个像素对应图中的一个相应顶点,另外还有s和t两个顶点。上图有两种边,实线的边表示每两个邻域普通顶点连接的边n-links,虚线的边表示每个普通顶点与s和t连接的边t-links。在前后景分割中,s一般表示前景目标,t一般表示背景。

图中每条边都有一个非负的权值w

  • 2
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
GraphCut是一种基于图论的图像分割算法,它可以将图像分割成多个部分,每个部分都具有一定的特征。在图论中,图由节点和边组成,节点表示图像中的像素点,边表示像素点之间的关系。GraphCut算法通过将图像中的像素点分为前景和背景,然后计算像素点之间的相似性和不同性,最后通过最小割算法将图像分割成多个部分。 在python中,可以使用OpenCV库中的cv2函数实现GraphCut算法。以下是一个基于pythonGraphCut分割算法的示例代码: ```python import cv2 import numpy as np # 读取图像 img = cv2.imread('image.jpg') # 创建掩模,将前景和背景标记为0和1 mask = np.zeros(img.shape[:2],np.uint8) bgdModel = np.zeros((1,65),np.float64) fgdModel = np.zeros((1,65),np.float64) # 定义矩形框,将其内部标记为前景 rect = (50,50,450,290) cv2.grabCut(img,mask,rect,bgdModel,fgdModel,5,cv2.GC_INIT_WITH_RECT) # 创建新的掩模,将前景和可能的前景标记为1,其余部分标记为0 new_mask = np.where((mask==2)|(mask==0),0,1).astype('uint8') # 应用新的掩模 new_img = img*new_mask[:,:,np.newaxis] # 显示图像 cv2.imshow('image',img) cv2.imshow('new_image',new_img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 该代码首先读取一张图像,并创建一个空的掩模。然后,定义了一个矩形框,将其内部标记为前景,并使用grabCut函数进行图像分割。接下来,创建一个新的掩模,将前景和可能的前景标记为1,其余部分标记为0。最后,应用新的掩模,生成一张新的图像,并显示原始图像和新图像。 需要注意的是,该代码中使用的是矩形框来标记前景,如果需要使用其他形状来标记前景,可以使用cv2.EVENT_LBUTTONDOWN和cv2.EVENT_LBUTTONUP函数实现鼠标交互,或者使用其他的算法来自动检测前景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值