使用边缘检测和scikit-image

时间:2016-05-15 04:00:09

标签: python opencv imagemagick scikit-image mahotas

我想从源RAW图像创建两个图像,在这种情况下是Canon CR2。我已经对RAW转换进行了排序和一些处理。我的最终图像需要是带有alpha蒙版的PNG和95%质量的JPG,而alpha区域则填充黑色。我在这里设置了一个测试图像,显示我在检测主题方面有多远:

http://imgur.com/a/Q8k3w/all

所以基本上,你可以看到我想把主题与灰色背景隔离开来。我也希望尽可能地掩盖灰色背景上投射的任何阴影,理想情况下也是完整的。我正在使用我编写的Python2脚本,到目前为止主要是scikit-image。如果需要,我会交换到另一个Python兼容的图像处理库。另外,我需要在内存中执行所有步骤,这样我只能在使用PNG然后JPG的所有图像处理结束时保存一次。所以没有subprocess.Popen等..

你会从样本图片中看到,至少我认为我已经找到了解决方案的方法。我已经将scikit-image及其Canny边缘算法用于我在示例中看到的图像。

我现在需要做的是弄清楚如何用白色填充Canny图像中的主题,这样我就可以得到一个合适的纯白色面具。在我的大多数示例图像中,应用了Canny过滤器,看起来对于受试者本身存在良好的边缘检测,通常具有主要的不间断边界。但是,我猜我将来可能会得到一些没有发生这种情况的图像,并且主要边界可能会有小的中断。我需要处理这种情况,如果它看起来像是后续处理步骤的问题。

另外,我想知道是否需要将整个边框增加一个像素并将其设置为与我的0,0像素相同的颜色(即背景中的第一个像素顶部/左边),然后运行我的Canny滤镜和然后再次缩小我的边界1px?这应该允许检测下边缘以及当受试者破坏框架的顶部或侧面时?

所以,我只是在寻找建议,并想知道下一步去哪里获得一个漂亮的固体面膜。它需要保持二进制作为二进制掩码(即主要主题之外的所有内容都需要被完全掩盖为0)。这意味着我需要运行一些东西,在某个点上查找某个像素体积以下的孤立像素岛 - 可能是最后一步并将它们添加到掩模中(例如50px左右)。

另外,总的来说,经验法则是,如果主体的一点点被掩盖而不是掩盖的背景越少(即我想要所有或尽可能多的背景/阴影区域)被掩盖。)

我尝试了一些事情,但还没有完全实现。我在想sci_kit中的find_contours可能会有所帮助。但我无法从scikit-images示例中看到我如何选择然后将检测到的轮廓转换为蒙版。我已经杀了相当多的时间试验今天没有成功,所以我想我会问这里,看看是否有人有更好的想法。

这是一个基于OpenCV的方法看起来很有希望:

http://funcvis.org/blog/?p=44

如果可能的话,我想坚持使用scikit-image或其他一些可互换的numpty图像库。但是,如果使用OpenCV或其他库只是更容易和更快,那么只要我能坚持使用Python,我就会接受这些想法。

另外值得注意的是,对于我的应用程序,我将始终拥有没有主题的背景图像。所以也许我应该追求这条路线。问题是我不认为简单的差异方法可以很好地处理阴影。在我看来,在某些时候需要某种边缘检测来获得更好的掩蔽方法。

1“来源1”

2“来源2”

3“来源3”

1“结果1”

2“结果2”

3“结果3”

2 个答案:

答案 0 :(得分:2)

从有限的经验来看,我会提供一些尝试的想法。

Canny边缘检测结果不区分孔(在结果2对象中)与纯色区域(在结果3中)。你的目的可以吗?它是否适合您在这些边缘进行斑点检测并填充斑点的需要,从而消除结果2中的空洞?

让我们假设您要遮盖的部分是原始的灰色背景区域以及该灰色背景上的深灰色阴影。此外,一些最小化尺寸灰色区域有资格作为"孔"而不是对象上的灰色像素或灰色噪声。 (有没有办法区分看起来像灰色背景的物体部分?)

所以考虑一下这个计划:

  1. 将图像转换为HSV(或HSL)色彩空间。
  2. 计算8位/像素灰阶"阈值掩码"图像,其中每个像素指示相应的输入像素是否可能是背景或可能是前景:如果输入像素的饱和度低于阈值ts(灰色或接近灰色)及其值(或亮度) )在阈值范围[tv1 .. tv2]内(暗影背景灰色到背景灰色),然后它可能是背景,所以使输出像素为0(黑色),否则为'可能是前景所以让它成为255(白色)。
  3. Dilate白色像素填补空白,然后Erode将其恢复原始大小。这对操作也称为Closing形态。 [请注意该页面上的示例图片是一个令人困惑的例子。它会扩张然后侵蚀样本图像的白色像素,这些像素很难不被视为黑白笔画!]
  4. 以上假设原始背景为均匀灰色,没有实际样品中的斑点。您可以通过使阈值参数成为原始背景颜色的函数来优化此计划以考虑背景变化。

    步骤2和3产生全有或全无alpha通道(蒙版)。在这些步骤(模糊逻辑)中使用多个灰度级可能更好,但是如何做到这一点并不明显。

    注意:如果您使用JPEG 2000作为最终输出图像格式,则单个文件可以包含有损压缩图像及其Alpha通道。它还可以保持原始RAW文件的全色深度。

答案 1 :(得分:1)

我要去拍这个。

如果你想要对象的干净面具,那就是一种称为自适应阈值处理(一种局部阈值处理方案)的东西,我认为它对你来说可能是可行的,特别是因为它可能会消除阴影的影响,以及尝试Otsu的阈值处理(另一种自动但全局的阈值处理方案)。

查看哪一个获得更好的结果并实现您想要的结果。

我说这是因为你的查询非常类似于经典的阈值问题(对象背景相同)。

当然使用形态学操作来清洁你的面具(正如另一个用户关闭指示就足以消除小的斑点噪声)。