gpt4 book ai didi

python - 使用边缘检测和 scikit-image 在 Python 中去除背景/屏蔽

转载 作者:太空宇宙 更新时间:2023-11-03 21:05:04 25 4
gpt4 key购买 nike

我想从源 RAW 图像创建两个图像,在这种情况下是佳能 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-image 示例中完全看出我如何选择然后将检测到的轮廓转换为蒙版。今天我已经浪费了很多时间进行实验但没有成功,所以我想我会在这里问,看看是否有人有更好的想法。

这是一种基于 OpenCV 的方法,看起来很有前景:

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

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

同样值得记住的是,对于我的应用程序,我将始终拥有没有主题的背景图像。所以也许我应该走这条路。问题是我认为简单的差异方法不能很好地处理阴影。在我看来,在某些时候需要某种边缘检测才能获得卓越的掩蔽方法。

1 “来源 1”

2 “来源2”

3 “来源3”

1 “结果 1”

2 “结果 2”

3 “结果 3”

最佳答案

根据有限的经验,我会提供一些尝试的想法。

Canny 边缘检测结果无法区分孔洞(在结果 2 对象中)和纯色区域(在结果 3 中)。这对你的目的好吗?它是否适合您在这些边缘上进行 Blob 检测并填充 Blob ,从而消除结果 2 中的漏洞?

假设您要屏蔽的部分是原始灰色背景区域以及该灰色背景上的较深灰色阴影。此外,一些最小尺寸的灰色区域被称为“洞”,而不是对象上的灰色像素或灰色噪声。 (有什么办法可以区分物体中看起来像灰色背景的部分吗?)

所以考虑这个计划:

  • 将图像转换为 HSV(或 HSL)色彩空间。
  • 计算 8 位/像素灰度“阈值掩码”图像,其中每个像素指示相应的输入像素是可能的背景还是可能的前景:如果输入像素的饱和度低于阈值 ts (灰色或接近灰色)及其值(或亮度)在阈值范围内 [tv1 .. tv2] (dark-shadow-background-gray 到 background-gray),那么它可能是背景,所以输出像素为 0(黑色),否则它可能是前景,所以将其设为 255(白色)。
  • Dilate填充空白的白色像素,然后 Erode它们恢复原状。这对操作也称为Closing形态学。 [请注意,该页面上的示例图片是一个令人困惑的示例。它会膨胀然后侵 eclipse 样本图像的白色像素,很难不将其视为黑白笔画!]

  • 以上假设原始背景是均匀的灰色,在您的实际样本中没有 Blob 。您可以通过使阈值参数成为原始背景颜色的函数来优化此计划以考虑背景变化。

    第 2 步和第 3 步生成全有或全无的 Alpha channel ( mask )。在这些步骤中使用多个灰度级可能会更好(模糊逻辑),但如何做到这一点并不明显。

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

    关于python - 使用边缘检测和 scikit-image 在 Python 中去除背景/屏蔽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37234413/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com