我有一张背景颜色恒定的图像。前面画了一些可能具有透明度的对象。有没有一种算法可以去除图像的背景,这样我就可以得到一张没有背景的透明对象图像?我想在我的代码中实现这一点,所以算法会很棒。
答案1
如果我理解正确,并且您没有告诉我们任何额外的信息,那么我相信这是不可能的。请考虑以下合成图像:
显然它的背景是蓝色的。现在,这里是前景物体:
我不知道如何才能通过一种算法从第一张图像得到第二张图像——没有足够的信息可供使用。
那么,如果您有更多信息,您能做什么?哪些额外的信息会有用?部分答案是您需要知道前景对象在哪里。如果前景对象与背景颜色相同,或者 100% 透明,并且没有边框,则它是不可见的,并且没有算法可以推断出它的存在。(并且,如果它们重叠,了解堆叠顺序可能会有所帮助。可能可以推断出这一点(即通过算法计算),但我不知道。)
但是,假设您知道物体的位置,请考虑:您的背景颜色为 B,被颜色为 F 且透明度为 T 的前景物体所遮挡。您看到的颜色 (C) 是什么?C 可以根据 B、F 和 T 计算得出。(如果 T=0,则 C=F;如果 T=1 (100%),则 C=B。)您知道 B 和 C;如果您知道另一个,那么您应该能够确定 F 或 T,这是有道理的。
也有例外,我在前面的段落中提到过。如果 C=B,物体是不可见的,因为它要么与背景颜色相同(F=B),要么 100% 透明(T=1)。如果知道 F=B=C,就不可能确定 T。如果知道 T=1,就不可能确定 F。但至少在第二种(T=1)情况下,如果你只是想确定前景物体是什么样子:它看起来是白色的。
许多程序都实现了此功能:PowerPoint(我用来创建图像的程序)、Photoshop、Paint.NET、GIMP 等,并且可能已记录在案。我建议您研究此功能C=f(B,F,T)
并弄清楚如何推导F=f′(B,T,C)
和T=f″(B,F,C)
。