使用编程方式将图像的背景透明或变为白色

4
如果一个人正在创建一个应用程序,并想要使图像的"背景"透明或白色,是否有一种方法可以做到这一点?
例如:
http://upload.wikimedia.org/wikipedia/commons/b/b9/Bronze_Statuette_of_a_Veiled_and_Masked_Dancer_1.jpg 图像中,我想通过编程方式转换图像,只保留雕像,而背景(即图像的其余部分)全部为白色或透明。
此外,用户可能会指出应该“保留”的图像部分,其余部分应全部为白色或透明。
如何实现这个功能?如果有适合的Java库或代码,则会很有帮助。
问候

1
可能是重复问题 - https://dev59.com/AHRB5IYBdhLWcg3wUFrB - mre
2
这不是重复的问题,但它与之相关。在这篇帖子中,这个人想要 1) 编程分离前景和背景 2) 并使背景透明。你提到的那篇帖子只做了第二点。自然地,第一点是问题中更难的部分。 - mpenkov
2个回答

4
你所要求的是前景和背景的编程分割。由于这是一个活跃的研究领域,你不太可能找到任何现成的源代码(尤其是Java)可以直接使用。
如果你有时间,请查阅图像分割相关论文,并浏览Google学术上的相关论文。你会发现,在一般情况下,这对计算机来说并不是一个容易解决的问题。在特定情况下,你可以尝试利用某些条件。在你指定的图像中,背景非常模糊,因此图形的边缘非常突出。使用Canny算子进行边缘检测,你可以得到以下结果:

enter image description here

虽然还不完美,但已经是一个开始。通过边缘信息,您可以定位主要的外轮廓并提取舞者的形状。


谢谢你的帮助。另外,我还有一个问题。如果用户可以指定要保留的图像部分怎么办?就像这样...http://www.mediacollege.com/adobe/photoshop/transparent/background.html。正如链接所指向的网页上所示,“使用魔术棒或套索工具,选择您想要透明的图像区域”。谢谢 - Vaibhav
我不熟悉 Photoshop 中魔术棒的实现,但是如果我要猜的话,他们可能使用了某种类似泛洪填充算法(http://en.wikipedia.org/wiki/Flood_fill)的东西。同时,您可以查看这个答案:https://dev59.com/_moy5IYBdhLWcg3wD53G。 - mpenkov
1
GIMP的源代码是可用的。实现GIMP等效的“模糊选择”(魔术棒)可能会给您提供有关改进标准泛洪填充算法的稳健性的提示。http://www.gimp.org/source/ - Rethunk

3
对于这张特定的图片,有几种方法可以解决部分问题。如果你将几种方法结合起来,并为用户提供交互选择,你可以在相对短的时间内开发出一个很好的软件。我会使用它!
你和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)通过在不同的焦距设置下连续拍摄多个图像。这可以帮助您基于梯度变化识别不同深度的图案。如果雕像离相机比较近,当相机对准无限远时,它将失去焦点。 提高易用性 假设您可以将图像分成合理区块,请提示用户单击属于同一感兴趣对象的区块。每个区块都可以拥有自己的调整参数,例如边缘强度、颜色接受范围等。区块特定参数可以帮助软件即使在阴影、不同照明等情况下仍可用于分割。类似的功能可以在GIMP和Photoshop中通过组合选择来完成,但它们的可用性还不够。
对于已经识别出来的区块,请实现“贴边”功能,以帮助用户将发现的边缘曲线移动到真正的边缘曲线上。如果用户抓住一个区块轮廓并向一个方向拖动,轮廓可以贴附到该方向的下一个强边缘上。
提供批量处理选项。如果用户有一系列在相同条件下拍摄的照片,则用户选择的第一张图像的区块可以帮助指导软件设置后续图像的参数。这并不是为了解决一般的分割问题,但可能会为某些图像组节省用户的时间和精力。
这是一个有趣的问题。祝你好运!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接