LED固件开发:求RGBW与HSB互转算法以保持亮度调整色调饱和度
RGBW与HSB转换及色调/饱和度调整方案
核心思路
RGBW的白色通道本质是叠加的无彩色分量,会同时降低饱和度并提升亮度。要实现保留亮度的色调/饱和度调整,关键是先将RGBW拆解为「无白色污染的纯净RGB分量」和「总白色分量」,对纯净RGB做HSB转换与调整,再重新合成RGBW。
步骤1:RGBW转HSB(保留亮度基准)
假设所有通道值范围为[0, 1](若为整数范围,先归一化处理):
- 提取RGB中的最小分量:
rgb_min = min(R, G, B) - 分离纯净RGB(完全无白色成分):
R_pure = R - rgb_minG_pure = G - rgb_minB_pure = B - rgb_min
- 计算总白色分量:
W_total = W + rgb_min - 计算HSB参数:
- 色调H:对纯净RGB执行标准RGB→HSB的色调计算(若纯净RGB全为0,H无意义)
- 饱和度S:若纯净RGB全为0,
S = 0;否则S = max(R_pure, G_pure, B_pure) / (max(R_pure, G_pure, B_pure) + W_total) - 亮度V:
V = max(R_pure, G_pure, B_pure) + W_total(这就是需要保留的亮度值)
步骤2:调整色调/饱和度并转回RGBW
已知目标H_new、S_new,且保持V不变:
- 计算彩色分量幅度与新白色分量:
- 若
S_new = 0:纯净RGB全为0,W_new = V - 否则:
color_mag = V * S_new(纯净RGB的最大通道值)W_new = V - color_mag(新的总白色分量)
- 若
- 根据H_new生成饱和度100%、最大幅度为color_mag的纯净RGB_new(执行标准HSB→RGB转换,将亮度设为color_mag)
- 合成最终RGBW:
- 方式一(直接映射):
R = R_new_pure,G = G_new_pure,B = B_new_pure,W = W_new - 方式二(优化通道分布):提取RGB_new_pure的最小值
rgb_min_new = min(R_new_pure, G_new_pure, B_new_pure),将其合并到W中:R = R_new_pure - rgb_min_newG = G_new_pure - rgb_min_newB = B_new_pure - rgb_min_newW = W_new + rgb_min_new
两种方式视觉效果完全一致,方式二可让RGB通道的最小值为0,更符合常规LED控制习惯。
- 方式一(直接映射):
示例验证
以你提到的RGBW={1.0, 0, 0, 1.0}为例:
- 拆解后:
rgb_min=0,R_pure=1,G_pure=0,B_pure=0,W_total=1,V=2,S=1/(1+1)=0.5,H=0° - 若调整S到1.0,保持V=2:
color_mag=2*1=2,W_new=0- 纯净RGB_new为
(2,0,0) - 最终RGBW为
(2,0,0,0),亮度2,饱和度100%,符合预期
- 若调整H到120°(绿色),保持S=0.5、V=2:
color_mag=2*0.5=1,W_new=1- 纯净RGB_new为
(0,1,0) - 最终RGBW为
(0,1,0,1),亮度2,饱和度50%,符合预期
内容的提问来源于stack exchange,提问作者Grodriguez
相关产品推荐
相关产品推荐

