Gimp的"Color to Alpha"功能背后有什么算法?

Des*_*ume 7 graphics image-processing raster-graphics

对于那些不熟悉Gimp的"Color to Alpha"功能的人来说,这里是Gimp文档中的页面:Color to Alpha.它确实做得非常好,我很清楚Gimp在颜色操作方面的确如此,无论颜色可能是哪个颜色空间.感谢一堆提示.

编辑1:根据像素与关键颜色(您在"颜色到Alpha"对话框中选择的颜色)的相似性生成像素的透明度信息,就像一些人在出于某种原因删除答案之前建议的那样,听起来像是一个很好的洞察力,但我认为它比那更复杂.假设我们估计单位范围内的颜色相似度从0.0到1.0,我们有一个像素的颜色,例如,0.4,类似于白色的颜色(就像你在"颜色到"中选择白色一样) Alpha"对话框",因此像素的alpha值为0.6,那么当结果像素显示在具有0.6的alpha的白色背景时,你将如何改变像素的实际颜色以补偿亮度/亮度/饱和度的松散?

编辑2:实际上是更新:如何在不改变结果颜色的情况下更改像素的alpha值,回答了与第一次编辑相关的子问题但它可能不是完整的故事,因为Gimp的"颜色到Alpha"功能的来源并不那么简单,似乎是基于特定的算法而不是公式.

Sam*_*mpo 8

我看了一下源代码,它的主要功能是colortoalpha功能.参数*a1到*a4分别是输入/输出红色,绿色,蓝色和alpha,c1到c3是制作alpha的颜色.

当您将两种颜色c1和c2与特定的αa(0≤a≤1)组合时,结果为

y = a * c1 + (1-a) * c2
Run Code Online (Sandbox Code Playgroud)

这里我们正在进行相反的操作:我们知道最终结果y和背景颜色c2,并想知道c1和a.由于这是一个指定不足的等式,因此存在无限量的解.但是,范围0≤c1≤255和0≤a≤1会增加解的边界.

Gimp插件的工作方式是每个像素最小化alpha值(即最大化透明度).相反,这意味着对于每个不完全透明的结果像素(即,不完全是背景颜色),RGB分量之一是0或255.

这将生成一个图像,当覆盖在指定颜色的顶部时,将生成原始图像(没有舍入误差)并且每个像素具有最大透明度.

值得注意的是,整个过程在RGB颜色空间中完成,但也可以在其他颜色空间中执行,只要组合操作在相同的颜色空间中完成即可.


use*_*321 1

您需要想出一种比较颜色相似度的机制。您可以在多种颜色空间中执行此操作。RGB 通常不是此类事物的最佳选择。但您可以使用 HSV、YCbCr 或其他一些亮度/色度空间。通常,这些空间之一中的距离会比 RGB 中的欧几里德距离给出更好的答案。获得距离后,您可以将其除以最大距离以获得百分比。作为一种可能性,该百分比将是您想要使用的 alpha 的倒数。

如果你想知道 GIMP 是如何做到的,你可以查看源码。例如,以下是该插件最近的一项代码更改。