基于显著性的图像分割

不懂技术怎么做产品?15天在线学习,补齐产品经理必备技术知识,再也不被开发忽悠。了解一下>

本篇文章介绍了显著性图像的分割,这个方法最初来源于对于发掘一个自动生成图像三分图方法的兴趣,这个抠图算法用于关注前景和背景细节的图像分割。

通常我们看到一幅图像的时候,我们都会关注于图像中的某一点上,这有可能是一个人,一个建筑物或者甚至是一个水桶。图像的清晰部分几乎没有什么意义,这些部分在图像中通常的特点是缺少关注点、颜色单调和纹理平滑。当这样一类图像出现的时候,它们是从图像剩余部分分割出感兴趣目标的理想图像。这篇文章就探索了这类显著性图像的分割。

显著性图像的例子。左边的水桶和右边的人就是感兴趣的目标。

这个项目最初来源于对于发掘一个自动生成图像三分图方法的兴趣。当和抠图算法相结合的时候三分图就是图像的掩膜。这个抠图算法用于关注前景和背景细节的图像分割。正常情况下一个三分图包含了前景的白色部分、背景的黑色部分和不确定的灰色区域。

基于显著性的图像分割

三分图的例子(来源于参考文献[2])

大多数抠图算法的问题就是它们希望由用户提供三分图,这是一个耗时的工作。这里有两篇我参考的主要的论文,他们尝试去自动生成三分图[1][2]。在第一篇论文里,Hsieh等人使用了一个 相当直接和易完成的方法。但不幸的是他们的方法并不是完全自动的,因为它需要用户给Grabcut算法提供一个矩形区域。Gupta等人而是使用显著性方法去预测感兴趣的区域。然而他们的显著性方法非常复杂,结合了三种显著性算法的结果。其中一种算法使用了卷积神经网络,这是一种我希望为了简单实现而避免使用的技术。

除了需要用户提供信息之外,Hsieh’s等人的算法产生的结果是非常合理的。我想如果我能够使Grabcut部分自动化,那么他们算法的其余部分就会解决最初始的那个问题。我是从Gupta等人提供的方法那里得到的去创造这样一个自动方法的灵感。

方法

很多的图像分割方法的目标就是将图像二值化为感兴趣的区域。这个项目的目标是不一样的。

首先,我想大致的找出感兴趣区域。将高斯模糊滤波器应用于图像。从模糊图像中生成平均15个像素大小的超像素。超像素算法旨在基于像素区域中的值的颜色和距离来打破图像。具体来说,用了简单线性迭代聚类算法(SLIC)。

基于显著性的图像分割

水桶和人的超像素图

超像素将图像分为几乎一样大小的区域。这样做的好处之一就是超像素允许区域的泛化。我们可以假设超像素里的大部分像素有着相似的属性。

与确定图像中的超像素并行地,计算图像的显著图使用了两种不同的显著性方法。第一种方法使用了内置的OpenCV方法,叫细粒度显著性。第二种方法涉及获取细粒度显著图像的平均值并从图像的高斯模糊图中减去它,就得到了新图像的绝对值。

这两种方法的不同之处在于结果的侵略性。下面的两张图象高亮了感兴趣区域。细粒度显著性方法产生的图像相对柔和一些。另外,细粒度显著性图像主要勾勒出显著图像的边界,尽管另一种方法也捕获了显著图的内部。与细粒度方法相比积极的方法确实产生了更多的噪声。消除噪声是这个过程的下一步。

基于显著性的图像分割

使用细粒度方法产生的水桶和人的显著性图

基于显著性的图像分割

使用积极显著性产生的水桶和人的显著性图

以下的技术是从Gupta等人的论文中挖掘出来的。为了对图像进行二值化,通过迭代从彩色图像生成每个超像素。如果显著性图像超像素区域的中间像素值大于阈值T1,那么这整个超像素就二值化为白色。否则整个超像素就是黑色。T1由用户选择。在参考文献[2]中,T1被设置为显著性图像中最大像素值的30%,但是在该项目中使用的是25%。

在二值化图像之后,扩张图像基于使用哪种显著性技术。在细粒度显著方法中,图像被扩大为超像素平均值的两倍大小。Aggressive显著性方法没有扩张图像。图像中出现的噪声越大,任何扩张都有风险。

基于显著性的图像分割

细粒度显著性方法(左)和二值化Aggressive显著性方法扩张后的水桶图像

最后一步又取决于使用哪种显著性方法。在这两种方法中,都提取了白色像素最大的区域。在OpenCV中,这个操作可以通过寻找图像中的轮廓并选择具有最大面积的轮廓来实现。对选择出来的区域会匹配一个包围框。

据观察,细粒度显著性方法常常会生成碎片区域。在包围框生成后,其他任何落在包围框里的不属于最大区域的白色部分都会被添加到包围框里。包围框的边界会增大来包围这些区域。Aggressive显著性方法并不需要这样做。通常最大区域的包含量超过了预期。

最后一步是将最终找到的包围框输入到Grabcut算法中。Grubcut是分割图像的常用方法。包围框给了Grabcut函数什么会被算法最终分割为背景和前景。在包含Grubcut应用程序的大多数软件包中,用户编辑矩形区域可以为算法产生更好的结果提供更多的信息。在这个项目中,使用了OpenCV内置的Grubcut功能。

基于显著性的图像分割

在桶的实验中,两种方法都产生了相同的结果。

此过程在[1]开始的地方结束。在将来我计划继续开发这种自动tripmap生成器。

结果

在这两种方法中,Aggressive显著性图似乎为大多数图像产生了精确的掩模。细粒度显著性方法产生的图像中的显著性目标更为“笨重”。如果图像很长或有卷须,则这些部分通常会与图像的其余部分断开连接。然而,由于其保守的性质,当图像特别嘈杂时,细粒度方法更好。掩模不一定能够捕获整个图像,但它并没有像Aggressive方法那样频繁地溢出。

基于显著性的图像分割

两种方法的样本结果

还要必要指出,对于[1]中开发的算法,欠发达的掩模并不坏。由于最终目标是开发tripmap图像,因此掩模将由灰色区域填充。该灰色区域将有助于区分前景和背景。

对于任何的每周的读者来说,使用C++学习OpenCV并实现这个算法是非常耗时的。对于时延感到很抱歉,但希望将来这个项目会继续并有更多的内容!

Github 代码地址:https://github.com/TimChinenov/GraspPicture

参考文献

[1] C. Hsieh and M. Lee, “Automatic trimap generation for digital image matting,” 2013 Asia-Pacific Signal and Information Processing Association Annual Summit and Conference, Kaohsiung, 2013, pp. 1–5.

[2] Gupta, Vikas & Raman, Shanmuganathan. (2017). Automatic Trimap Generation for Image Matting.

 

本文为 AI 研习社编译的技术博客,原标题 :Saliency Based Image Segmentation

作者:Tim Chin,翻译:GAOLILI

原文链接:https://towardsdatascience.com/saliency-based-image-segmentation-473b4cb31774

本文来源于人人都是产品经理合作媒体 @雷锋网,翻译@GAOLILI

题图来自Unsplash,基于CC0协议。

给作者打赏,鼓励TA抓紧创作!
评论
欢迎留言讨论~!