如何将热力图RGB颜色线性映射回原始刻度值(已知基准色对应值)
从热力图RGB颜色反推原始值的方法
先处理特殊情况
- 若方块RGB为(255,255,255)(或接近纯白),直接标记为NaN,无需后续计算。
核心逻辑
已知颜色与数值为线性映射,分为两段独立渐变区间:
- 蓝色(-100)→ 黑色(0):仅蓝色通道从255线性降至0
- 黑色(0)→ 红色(+10):仅红色通道从0线性升至255
实际提取的RGB可能存在轻微偏差,按以下步骤计算:
步骤1:判断颜色所属渐变区间
- 若蓝色通道(B)数值远大于红、绿通道(B > R且B > G),归为蓝→黑区间
- 若红色通道(R)数值远大于绿、蓝通道(R > G且R > B),归为黑→红区间
- 若RGB接近(0,0,0),直接对应数值0
步骤2:线性计算对应数值
蓝→黑区间(-100 ~ 0)
利用蓝色通道的相对占比计算:
value = (B / 255) * (-100)
示例:RGB(0,0,127) → (127/255)*(-100) ≈ -49.8,近似-50
黑→红区间(0 ~ +10)
利用红色通道的相对占比计算:
value = (R / 255) * 10
示例:RGB(127,0,0) → (127/255)*10 ≈ 4.98,近似5
步骤3:非理想颜色的近似修正
若提取的RGB并非单通道渐变(比如蓝→黑区间存在少量R/G值),可通过颜色距离优化:
- 计算当前RGB到三个锚点的欧氏距离:
- 到蓝点(0,0,255):
d_blue = sqrt(R² + G² + (B-255)²) - 到黑点(0,0,0):
d_black = sqrt(R² + G² + B²) - 到红点(255,0,0):
d_red = sqrt((R-255)² + G² + B²)
- 到蓝点(0,0,255):
- 若
d_blue + d_black最小,归为蓝→黑区间,用B通道计算;若d_black + d_red最小,归为黑→红区间,用R通道计算。
内容的提问来源于stack exchange,提问作者Gabriel Cia
相关产品推荐
相关产品推荐

