+-

我正在寻找一种通用算法来平滑地在两种颜色之间转换.
例如,此图像取自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 – 平滑的颜色过渡算法 - 乐贴网