图像分割经典算法--《图割》(Graph Cut、Grab Cut-----python实现)

1. 算法介绍

Graph Cut(图形切割)应用于计算机视觉领域用来有效的解决各种低级计算机视觉问题,例如图像平滑(image smoothing)、立体应对问题(stereo correspondence problem)、图像分割(image segmentation)等等。此类方法把图像分割问题与图的最小割(min cut)问题相关联,在计算机视觉的很多类似的问题中,最小能量(minimum energy)方案对应解决方案的最大后验估计(maximum posterior estimate)。
友情链接:图像分割经典算法(最小割最大流)
使用Graph Cut的方法可以精确的解决”二进制问题“(binary problem),例如对二进制图像进行去噪。可以用两个以上不同的标签(例如立体对应(stereo correspondence)或灰度图像的去噪)标记像素的问题不能精确解决,但产生的解决方案通常能够接近全局最优的效果。

2. GraphCut

GraphCut利用最小割最大流算法进行图像的分割,可以将图像分割为前景和背景。使用该算法时需要在前景和背景处各画几笔作为输入,算法将建立各个像素点与前景背景相似度的赋权图,并通过求解最小切割区分前景和背景。算法效果图如下:
原始图片
original
标注图片
notation
分割后的图片
after
相关论文及python实现代码:

PAPER:
1.Fast approximate energy minimization via graph cuts
2.Graph based algorithms for scene reconstruction from two or more views
3.What energy functions can be minimized via graph cuts?
4.Interactive Graph Cuts for Optimal Boundary & Region Segmentation of Objects in N-D Images
CODE
https://github.com/cm-jsw/GraphCut
参考项目:https://github.com/NathanZabriskie/GraphCut

3.GrabCut

GrabCut的详细解释参考博客:
图像分割之(三)从Graph Cut到Grab Cut

图像分割之(四)OpenCV的GrabCut函数使用和源码解读

GrabCut
GrabCut是对其的改进版,是

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函数实现鼠标交互,或者使用其他的算法来自动检测前景。
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值