OpenCV——使用GrabCut算法进行物体分割
发布日期:2021-07-01 04:08:51
浏览次数:2
分类:技术文章
本文共 1251 字,大约阅读时间需要 4 分钟。
GrabCut算法的实现步骤为:
- 在图片中定义含有(一个或多个)物体的矩形。
- 矩形外的区域被自动认为是背景。
- 对于用户定义的矩形区域,可用背景中的数据来区别它里面的前景和背景区域。
- 用高斯混合模型(Gaussians Mixture Model,GMM)来对背景和前景建模,并将未定义的像素标记为可能的前景或背景。
- 图像中的每一个像素都被看作通过虚拟边与周围像素相连接,而每条边都有一个属于前景或背景的概率,这基于它与周围像素颜色上的相似性。
- 每一个像素(即算法中的节点)会与一个前景或背景节点连接。
- 在节点完成连接后(可能与背景或前景连接),若节点之间的边属于不同终端(即一个节点属于前景,一个节点属于背景),则会切断它们之间的边,这就能将图像各部分分隔出来。
下面的示例代码主要有这几步:
- 加载想要处理的图像,然后创建一个与图像大小相同的掩模,并用0填充。
- 创建以0填充的前景和背景模型。
- 准备一个标识出想要隔离的对象的矩形来初始化GrabCut算法。
- 使用指定的空模型和掩模来运行GrabCut算法。
- cv2.grabCut()的第六个参数是算法迭代的次数,执行完算法之后,掩模已经变成了包含0~3的值,其中值为0和2的为背景,值为1和3的为前景。
- 使用matplotlib来并排展示处理前后的图像。
示例代码如下:
import numpy as npimport cv2from matplotlib import pyplot as pltimg = cv2.imread('statue_small.jpg')mask = np.zeros(img.shape[:2], np.uint8)bgdModel = np.zeros((1, 65), np.float64)fgdModel = np.zeros((1, 65), np.float64)rect = (100, 1, 421, 378)cv2.grabCut(img, mask, rect, bgdModel, fgdModel, 5, cv2.GC_INIT_WITH_RECT)mask2 = np.where((mask == 2) | (mask == 0), 0, 1).astype('uint8')img = img * mask2[:, :, np.newaxis]plt.subplot(121), plt.imshow(img)plt.title("grabcut"), plt.xticks([]), plt.yticks([])plt.subplot(122), plt.imshow(cv2.cvtColor(cv2.imread('statue_small.jpg'), cv2.COLOR_BGR2RGB))plt.title("original"), plt.xticks([]), plt.yticks([])plt.show()
原图像statue_small.jpg为:
运行结果为:
转载地址:https://mortal.blog.csdn.net/article/details/83188820 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月21日 02时20分30秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
《计算机视觉-一种现代方法(第2版)》读书笔记六:应用之图像搜索和检索
2019-05-02
如何撰写高水平的学术论文
2019-05-02
谭浩强《C++面向对象程序设计》知识点总结
2019-05-02
分享一个关于介绍TextCNN和TextRNN的文章
2019-05-02
关于CNN中感受野的理解和计算方法
2019-05-02
java基础----RandomAccessFile
2019-05-02
__attribute__((packed))
2019-05-02
Android深入浅出之Binder机制
2019-05-02
linux查看硬件信息
2019-05-02
linux支持大于4G内存
2019-05-02
WM_GETINFO相关
2019-05-02
填入空隙(setbkcolor,setbkmode)
2019-05-02
[收藏] FC交换机基础知识详解
2019-05-02
关于数据中台系统,需要了解哪些技术?
2019-05-02
Linux调试工具
2019-05-02
用Eclipse和GDB构建ARM交叉编译和在线调试环境
2019-05-02
Ubuntu下 rsync同步文件实例
2019-05-02
安装Samba时遇到错误
2019-05-02
详细解析Java中抽象类和接口的区别
2019-05-02
Linux下的同步与异步
2019-05-02