You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何量化分析两张颜色映射图的差异?无原始数据场景方案

解决方案:从RGB颜色映射图提取定量差异并可视化

核心问题分析

直接将RGB转32位整数做减法的问题在于:32位整数的数值变化和视觉感知的颜色(对应材料属性)变化完全不匹配——RGB是三通道组合值,整数减法无法反映红→绿→蓝线性渐变的属性差异。正确思路是先把RGB反向映射回对应材料属性的线性刻度值,再计算差异。

步骤1:将RGB转换为线性属性刻度

因为你的颜色映射是红→绿→蓝的线性渐变,先定义原始颜色映射的锚点(可根据实际图的颜色调整):

  • 红((255, 0, 0))→ 属性最小值(如0)
  • 绿((0, 255, 0))→ 属性中间值(如50)
  • 蓝((0, 0, 255))→ 属性最大值(如100)

针对每个像素的RGB值,判断其处于红-绿段还是绿-蓝段,计算对应线性刻度值:

import numpy as np

def rgb_to_linear(rgb_array):
    # 转换为0-1范围的浮点数组
    rgb = rgb_array.astype(np.float32) / 255.0
    
    # 定义颜色锚点(归一化到0-1)
    red = np.array([1.0, 0.0, 0.0])
    green = np.array([0.0, 1.0, 0.0])
    blue = np.array([0.0, 0.0, 1.0])
    
    # 计算每个像素到三个锚点的欧氏距离
    dist_red = np.linalg.norm(rgb - red, axis=2)
    dist_green = np.linalg.norm(rgb - green, axis=2)
    dist_blue = np.linalg.norm(rgb - blue, axis=2)
    
    linear = np.zeros_like(dist_red)
    
    # 处理红-绿区间的像素
    red_green_mask = dist_red < dist_blue
    ratio_rg = dist_red[red_green_mask] / (dist_red[red_green_mask] + dist_green[red_green_mask])
    linear[red_green_mask] = ratio_rg * 50  # 红→绿对应0→50
    
    # 处理绿-蓝区间的像素
    green_blue_mask = dist_blue <= dist_red
    ratio_gb = dist_blue[green_blue_mask] / (dist_blue[green_blue_mask] + dist_green[green_blue_mask])
    linear[green_blue_mask] = 50 + (1 - ratio_gb) * 50  # 绿→蓝对应50→100
    
    return linear

步骤2:计算差异并可视化

得到线性刻度矩阵后,直接做差得到定量属性差异,再用差异色图放大细微变化:

import matplotlib.pyplot as plt
from PIL import Image

# 读取两张颜色映射图
img1 = np.array(Image.open("image1.png"))
img2 = np.array(Image.open("image2.png"))

# 转换为线性刻度
linear1 = rgb_to_linear(img1)
linear2 = rgb_to_linear(img2)

# 计算差异(可根据需求调整顺序)
diff = linear1 - linear2

# 可视化差异图
plt.figure(figsize=(10, 8))
im = plt.imshow(diff, cmap="coolwarm", vmin=-np.max(np.abs(diff)), vmax=np.max(np.abs(diff)))
plt.colorbar(im, label="属性差异 (img1 - img2)")
plt.title("两张图的属性差异可视化")
plt.axis("off")
plt.show()

关键优化点

  • 匹配视觉感知:反向映射到线性属性后,差异值直接对应材料属性变化,和颜色视觉变化一致。
  • 放大细微差异:coolwarm色图(蓝-白-红)可清晰区分正负差异,设置vmin/vmax为差异极值,能凸显细微变化。
  • 效率提升:用numpy向量化操作替代嵌套循环,速度更快、代码更简洁。

替代工具库

  • 若颜色映射用了感知均匀空间(如CIELAB),可使用colorspacious库做RGB转换,再计算差异。
  • 批量处理或复杂图像分析可使用scikit-image库的图像差异工具。

内容的提问来源于stack exchange,提问作者Phil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 03:23:12