+-
c – 平滑的颜色过渡算法
我正在寻找一种通用算法来平滑地在两种颜色之间转换.

例如,此图像取自Wikipedia并显示从橙色到蓝色的过渡.

当我尝试使用我的代码(C)做同样的事情时,想到的第一个想法是使用HSV颜色空间,但是令人讨厌的中间颜色显示.

实现这一目标的好方法是什么?似乎与对比度的减少有关,或者可能使用不同的色彩空间?

最佳答案
我过去做过很多这些.平滑可以通过许多不同的方式执行,但它们在这里可能采用的方式是简单的线性方法.这就是说,对于每个R,G和B分量,它们只是找出连接这两个点的“y = m * x b”方程,并用它来计算其间的分量.

m[RED]   = (ColorRight[RED]   - ColorLeft[RED])   / PixelsWidthAttemptingToFillIn
m[GREEN] = (ColorRight[GREEN] - ColorLeft[GREEN]) / PixelsWidthAttemptingToFillIn
m[BLUE]  = (ColorRight[BLUE]  - ColorLeft[BLUE])  / PixelsWidthAttemptingToFillIn

b[RED]   = ColorLeft[RED]
b[GREEN] = ColorLeft[GREEN]
b[BLUE]  = ColorLeft[BLUE]

现在之间有任何新颜色:

NewCol[pixelXFromLeft][RED]   = m[RED]   * pixelXFromLeft + ColorLeft[RED]    
NewCol[pixelXFromLeft][GREEN] = m[GREEN] * pixelXFromLeft + ColorLeft[GREEN]
NewCol[pixelXFromLeft][BLUE]  = m[BLUE]  * pixelXFromLeft + ColorLeft[BLUE]

有许多数学方法可以创建转换,我们真正想要做的是了解您真正希望看到的转换.如果要查看上图中的确切过渡,则值得查看该图像的颜色值.我及时编写了一个程序来查看这些图像并以图形方式输出值.以下是我的上述伪彩色标度程序的输出.

根据图表,如上所述,它比线性更复杂.蓝色组件看起来大部分是线性的,红色可以模拟为线性,但绿色看起来更圆润.我们可以对绿色进行数学分析,以更好地理解它的数学函数,并使用它来代替.您可能会发现,在像素70之后具有0到约70像素之间的增加斜率的线性插值具有线性减小的斜率就足够了.

如果您查看屏幕底部,此程序会给出每种颜色分量的一些统计测量值,例如最小值,最大值和平均值,以及图像读取的宽度.

点击查看更多相关文章

转载注明原文:c – 平滑的颜色过渡算法 - 乐贴网