RGB颜色空间转换HSV颜色空间 RGB2HSV算法

本文详细分析了一段用于将RGB颜色空间转换为HSV颜色空间的GLSL代码,探讨了代码的效率优化,包括如何避免除以零、减少比较次数和提高性能。通过使用混合和步骤函数,代码实现了对RGB值的排序和HSV计算。作者还解释了色调计算中可能的负值和正值情况,并展示了性能基准测试结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

这是最常用的RGB到HSV例程,还有一个额外的小优化(向除数添加1e-20f以避免需要将除法除以零):

 

 

讲解:——————————————action————————————————

直接看这段代码很有可能会不知所云。首先要理解HSV颜色空间与RGB颜色空间的转换原理。查找相关资料后并不难理解。这里贴出一张最终计算公式。

上述代码就是围绕这个计算公式进行的。

1.首先计算出RGB的最大和最小通道值

2.计算delta差值

3.直接计算S V通道值

4.首先根据下面公式直接翻译代码(1.0f对应60°)

讲解:——————————————end—————————————————

有几件事情值得注意:

 

                                                                                         图3

讲解:——————————————action————————————————

直接看图1。当时蒙圈了。仔细分析后发现只是将H<0的时候的情况拆开了。

例如V=R时。G和B的关系并不确定。但我们公式中是(G-B)这个我们希望保持不变。

因此当G>B时公式不变

B>R时 公式结构不变。但符号明显是负的,只需加上6.0f(即360°)

图2 图3也就迎刃而解

讲解:——————————————end—————————————————

这实际上是相同的计算!只有色调偏移K会发生变化。现在的想法如下:

 

将这个想法付诸实践为我们提供了以下代码

 

 

讲解:——————————————action—————————————————

通过上述。我们知道,最终目的是构建一个K值,用了解最终的H颜色通道是加上多少数值,确保在(0-360°)空间内

这段代码具体为什么这样书写,由于能力有限是在难以理解,但带入各个值进去,最终结果都是正确的

讲解:——————————————end——————————————————

您可以自己检查上面显示的K值是否由该函数正确生成。还有许多其他方法可以对(r,g,b)进行排序但是这个特定方法可以让我们进行最后一次优化。

我们注意到,在过去的交换有效地改变的迹象ķ 的符号g ^ - B。由于两者都被添加并传递给fabs(),实际上可以省略符号反转。

额外的tip给了我们这个最终的代码:

 

 

这是2次测试和1次std :: min调用,而不是之前的3次测试和4次std :: min / max调用。我们真的应该在这里看到一些性能提升。

正如预期的那样,基准测试表明,各种CPU,编译器和编译器标志的性能提升了25%到40%。下图(每次转换的平均纳秒数)在Core i7-2600K CPU上,使用g ++ 4.7.2 -O3 -ffast-math

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值