如果正在创建一个应用程序,其中一个人想要使图像的“背景”透明或白色,有没有办法做到这一点?
例如:
在图像http://upload.wikimedia.org/wikipedia/commons/b/b9/Bronze_Statuette_of_a_Veiled_and_Masked_Dancer_1.jpg中,我想以编程方式转换图像,以便只保留雕像,背景(即图像的其余部分)全部为白色或透明。
此外,用户可能会指出应该“保留”的图像部分,其余部分应全部为白色或透明。
如何做到这一点?此外,如果有一个合适的java库或一段代码,那将会有所帮助。
此致
答案 0 :(得分:2)
您要求的是前景和背景的程序化细分。由于这是一个活跃的研究领域,您不太可能找到任何开箱即用的现成模式源代码(特别是在Java中)。
如果您有时间,请查看image segmentation并浏览Google学术搜索中的相关论文。您将会看到,在一般情况下,计算机解决这个问题并不容易。在特定情况下,您可以尝试利用某些条件。在您指定的图像中,背景非常模糊,因此图形的边缘非常突出。使用Canny operator进行边缘检测可以为您提供:
这不完美,但这是一个开始。使用边缘信息,您可以找到主要外部轮廓并提取舞者图。
答案 1 :(得分:2)
对于该特定图像,有几种方法可以解决部分问题。也许如果你结合多种方法和提供用户交互选择,你可以在相当短的时间内开发出一个好的软件。我会用它!
你和Misha已经讨论了前两项:
提高可用性
假设您可以将图像分割成相当不同的块,提示用户单击属于同一个感兴趣对象的块。每个块可以具有其自己的一组用于边缘强度,颜色接受范围等的调整参数。具有块特定参数可以帮助使软件可用,即使存在阴影,变化的光照等,这给分割带来问题。这样的东西可以通过组合选择在GIMP和Photoshop中完成,但它的可用性不如它。
对于已识别的块,实现“捕捉到边缘”功能,帮助用户将发现的边缘曲线移动到真实的边缘曲线上。如果用户抓取一个块状轮廓并将其拖向一个方向,则轮廓可以捕捉到该方向上的下一个强边缘。
提供批处理选项。如果用户具有在相同条件下拍摄的一系列照片,则用户选择的第一图像的块可以帮助引导软件设置连续图像的参数。这不是为了解决一般的分割问题,而是为某些图像组节省了一些时间和精力。
这是一个有趣的问题。祝你好运!