You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

PyQtGraph关联直方图的ImageItem颜色映射标识保存与自动加载问询

刚好之前做过类似的需求,完全不用保存整个LUT数组,PyQtGraph本身就提供了更简洁的方式来记录颜色映射的标识,分两种情况来处理:

解决方案

1. 针对内置颜色映射:直接保存名称

PyQtGraph自带了大量预定义的颜色映射(比如viridisplasmainferno这些),如果你的直方图选择的是这类内置映射,只需要保存它的名称就足够了,后续直接通过名称就能重建完全一致的颜色映射。

代码示例:

import pyqtgraph as pg
import json

# 获取当前ImageItem关联的颜色映射(返回QColorMap对象)
current_cmap = image_item.getLookupTable(returnQMap=True)
# 获取内置颜色映射的名称
cmap_identifier = current_cmap.name()

# 保存名称到配置文件
with open('cmap_config.json', 'w') as f:
    json.dump({'colormap': cmap_identifier}, f)

# 后续加载时重建颜色映射
with open('cmap_config.json', 'r') as f:
    config = json.load(f)
loaded_cmap = pg.colormap.get(config['colormap'])
# 给ImageItem应用加载后的颜色映射
image_item.setLookupTable(loaded_cmap.getLookupTable())

2. 针对自定义颜色映射:保存关键参数而非LUT

如果是你通过直方图手动调整出来的自定义颜色映射,不用保存生成的512×3数组,只需要保存颜色映射的控制点(颜色+位置)插值模式——这些是颜色映射的“核心定义”,体积极小且能精确重建原映射。

代码示例:

import pyqtgraph as pg
import json

# 获取当前自定义颜色映射对象
custom_cmap = image_item.getLookupTable(returnQMap=True)

# 提取关键参数:控制点的位置和对应的RGB颜色
control_points = []
for pos in custom_cmap.stops():
    color = custom_cmap.color(pos)
    control_points.append({
        'position': pos,
        'color': (color.redF(), color.greenF(), color.blueF())
    })

# 整理保存数据,包含插值模式
save_data = {
    'type': 'custom',
    'control_points': control_points,
    'interpolation': custom_cmap.interpolationMode()
}

# 保存到文件
with open('custom_cmap.json', 'w') as f:
    json.dump(save_data, f)

# 加载并重建自定义颜色映射
with open('custom_cmap.json', 'r') as f:
    loaded_data = json.load(f)

colors = [tuple(p['color']) for p in loaded_data['control_points']]
positions = [p['position'] for p in loaded_data['control_points']]
rebuilt_cmap = pg.ColorMap(positions, colors, interpolation=loaded_data['interpolation'])

# 应用到ImageItem
image_item.setLookupTable(rebuilt_cmap.getLookupTable())

为什么这比保存LUT更好?

  • 体积极小:内置映射名称仅几个字符,自定义映射的参数也只是几十条数据,远小于512×3的数组
  • 灵活性更高:后续可以根据需求生成不同尺寸的LUT(比如256或1024),而固定LUT只能用固定尺寸
  • 可编辑性强:如果后续需要微调颜色映射,直接修改参数比修改LUT数组方便得多

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

火山引擎 最新活动