OpenCV 基于超像素分割的图像区域选取方法及源码


本系列文章由 @yhl_leo 出品,转载请注明出处。
文章链接: http://blog.csdn.net/yhl_leo/article/details/51386993


工程源码GitHub: yhlleo/SuperpixelRegionFill

抠取图像区域的一个小demo,借助图像超像素分割的方法,将图像成子分块,再利用种子填充算法,选取子块区域。

超像素分割方法,采用论文 SEEDS: Superpixels Extracted via Energy-Driven Sampling 提出的方法,对于物体的边界具有较好的保留,如下图所示。可以辅助目标检测中制作Banchmark。

star
star_labels

本工程在其基础上,获得的图像labelscontours,然后分别实现区域种子填充,Windows下编译环境为:

  • OpenCV
  • CMake
  • Visual Studio

工程demo包括:

  • SuperSeedsTest: SEEDS 提供的用例,可获取超像素分割labelscontours
  • SeedFillTest : 基于labels种子填充子块
  • BoundaryFillTest : 基于contours种子填充子块

vs_solution

(测试代码以./data文件下demo.jpg为例)

demo-seg

在选取了种子点(col, row)->(248, 71)后,两种方法得到的区域mask分别为:

demo-contours-sf

demo-contours-bf

由于保存的labels图像是8bit位图(内存中是CV_32SC1),所以是有损的,如果使用labels区域填充的时候,最好不要使用demo中从保存图像中加载labels数据(也就是在内存中进行,例如通过函数传参)。

种子填充算法使用递归的形式,对于小块的像素区域比较有效,但是由于编译器栈深度有限,填充区域过大的时候,会出现栈溢出的BUG,这里需要注意一下(有时间再优化这里)。

更复杂的接口以及操作,可以根据需要自己定义。

References

转载于:https://www.cnblogs.com/hehehaha/p/6332132.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值