【问题标题】:Make an image's background transparent or white programmatically以编程方式使图像的背景透明或白色
【发布时间】:2012-02-07 01:50:04
【问题描述】:

如果您正在创建一个应用程序,希望将图像的“背景”设置为透明或白色,有没有办法做到这一点?

例如:

在图像 http://upload.wikimedia.org/wikipedia/commons/b/b9/Bronze_Statuette_of_a_Veiled_and_Masked_Dancer_1.jpg 中,我想以编程方式转换图像,以便只保留雕像,而背景(即图像的其余部分)全为白色或透明。

此外,用户可能会指出图像中应该“保留”的部分,而其余部分应该是全白或透明的。

如何做到这一点?另外,如果有合适的 java 库或代码,也会很有帮助。

问候

【问题讨论】:

  • 它不是重复的,但它是相关的。在这篇文章中,这个家伙想要 1) 以编程方式分离前景和背景 2) 并使背景透明。你提到的帖子只做2)。自然,1) 是问题中更难的部分。

标签: java image image-processing image-manipulation


【解决方案1】:

对于该特定图像,有几种方法可以解决部分问题。也许如果您结合多种方法为用户提供交互式选择,您可以在相当短的时间内开发出一个好的软件。我会用它!

你和 Misha 已经讨论过前两项:

  1. 使用 Canny 或其他方式进行边缘检测。我建议您应该处理“原始”边缘强度图像,而不是对边缘强度进行阈值化以生成二值化图像。请注意,在这种情况下,人物清晰对焦,并且大部分背景都没有对焦。虽然这不是一个通用的解决方案,但对于这个特定的图像,您可以过滤掉 (a) 属于线(使用 Hough 或 RANSAC)但 (b) 具有低于阈值陡度的梯度的边缘。
  2. 洪水填充。 Misha 已经提供了链接。填充“静态”值不应该太难实现(例如,填充相对于单击像素的值 +/- N 的所有相邻像素)。实现一个动态的泛光填充,可以考虑到由于光照和 3D 曲率引起的渐变。 . .哎哟!
  3. 均值偏移聚类。这甚至可以作为帮助将相同 HSV 值的像素聚集在一起的第一步。但是,仅用眼睛观察图像,前景人物的色调和大部分背景的色调是相似的。 OpenCV 有一个均值偏移的实现。工作中有一段相关CAMSHIFT算法的视频:http://www.youtube.com/watch?v=iBOlbs8i7Og
  4. 边缘跟随以获得强边缘。如果用户在边缘附近单击,您可以识别最近的强边缘,然后使用轮廓跟踪(或“轮廓跟踪”)算法。基本的轮廓跟踪算法适用于二值图像;您可以调整您的算法以尝试在 RGB 空间中遵循强大的优势。棘手!
  5. 由于您正在为用户编写软件,因此请花一些时间在软件可用性上,而不是仅仅尝试解决一般的图像处理问题。
  6. 检查背景曲线的遮挡。另一种确定项目是否是背景的一部分的方法是确定它是否被前景对象遮挡(隐藏)。如果您发现两条线段共线且渐变平缓(即,它们不在焦点上),那么它们可能是两条线段,而不是一条,因为它们被前景物体遮挡了。
  7. 如果您有机会使用相机而不是现有图像,您可以通过在不同焦距设置下拍摄多张连续图像来模拟“光场”或全光相机(例如 Lytro https://www.lytro.com/camera)。这可以帮助您根据渐变的变化识别不同深度的图形。如果雕像离相机相对较近,当相机聚焦到无限远时,它就会失焦。

提高可用性

  1. 假设您可以将图像分割成相当不同的块,提示用户单击属于同一感兴趣对象的块。每个块都可以有自己的一组调整参数,用于边缘强度、颜色的接受范围等。拥有特定于块的参数可以帮助使软件可用,即使存在阴影、变化的照明等,这会给分割带来问题。可以通过组合选择在 GIMP 和 Photoshop 中完成类似的操作,但它的实用性不如预期。

  2. 对于已识别的块,实现“对齐边缘”功能,帮助用户将发现的边缘曲线移动到真正的边缘曲线上。如果用户抓住一个块轮廓并将其向一个方向拖动,该轮廓可能会捕捉到该方向上的下一个强边缘。

  3. 提供批处理选项。如果用户在相同条件下拍摄了一系列照片,那么用户为第一张图像选择的块可以帮助指导软件设置连续图像的参数。这并不是为了解决一般的分割问题,但可能会为用户节省一些时间和精力来处理某些图像组。

这是一个有趣的问题。祝你好运!

【讨论】:

    【解决方案2】:

    您要求的是前景和背景的程序化分割。由于这是一个活跃的研究领域,您不太可能找到任何开箱即用的就绪模式源代码(尤其是在 Java 中)。

    如果您有时间,请查找 image segmentation 并在 Google Scholar 上浏览相关论文。你会看到,在一般情况下,这对计算机来说并不是一个容易解决的问题。在特定情况下,您可以尝试利用某些条件。在您指定的图像中,背景非常模糊,因此图形的边缘非常突出。使用Canny operator 进行边缘检测可以为您提供:

    这并不完美,但这是一个开始。利用边缘信息,可以定位主要外轮廓,提取舞者形象。

    【讨论】:

    • 感谢您的帮助。另外,我还有一个问题。如果用户可以指定他想要保留的图像部分怎么办?像这样的东西....mediacollege.com/adobe/photoshop/transparent/background.html。如链接指向的网页上所示,“使用魔术棒或套索工具,选择您想要透明的图像区域”。谢谢
    • 我不熟悉 Photoshop 中魔术棒的实现,但如果我不得不猜测,我会说他们正在使用某种洪水填充算法 (en.wikipedia.org/wiki/Flood_fill)。也看看这个答案:stackoverflow.com/questions/8801047/….
    • GIMP 的源代码可用。 GIMP 等效于“模糊选择”(魔术棒)的实现可以为您提供有关调整的线索,以提高标准洪水填充算法的鲁棒性。 gimp.org/source
    猜你喜欢
    • 2012-09-21
    • 1970-01-01
    • 2014-08-21
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 2015-06-22
    • 1970-01-01
    相关资源
    最近更新 更多