gpt4 book ai didi

c++ - 平滑的颜色过渡算法

转载 作者:IT老高 更新时间:2023-10-28 23:03:53 26 4
gpt4 key购买 nike

我正在寻找一种在两种颜色之间平滑过渡的通用算法。

例如,这张图片取自 Wikipedia并显示从橙色到蓝色的过渡。

enter image description here

当我尝试使用我的代码 (C++) 做同样的事情时,首先想到的是使用 HSV 颜色空间,但会出现令人讨厌的中间颜色。

enter image description here

实现这一目标的好方法是什么?似乎与降低对比度或使用不同的色彩空间有关?

最佳答案

我过去做过很多这样的事情。可以通过许多不同的方式执行平滑,但他们可能在这里执行的方式是简单的线性方法。也就是说,对于每个 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]

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

enter image description here

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

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

关于c++ - 平滑的颜色过渡算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21835739/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com