如何用Python结合1D LUT将树莓派相机JPG转为伪彩色图?
解决自定义LUT伪彩色映射偏色问题(Pillow+Numpy高效方案)
你的代码输出偏蓝是因为错误地将LUT拆分为RGB三通道独立映射,而非把单灰度值直接对应到LUT的完整RGB像素组。以下是适配树莓派性能的修正方案:
问题根源
原代码的核心逻辑错误:
- 将灰度图转成RGB后,三通道像素值完全一致
- 使用
image.point(lut)时,flatten后的LUT会被拆分:前256个值给R通道、中间256个给G通道、最后256个给B通道,这和你需要的「单灰度值对应一组RGB」逻辑完全不符
修正后的代码
from PIL import Image import numpy as np # 1. 读取原图并转为单通道灰度图 gray_img = Image.open('testbild.jpg').convert('L') gray_np = np.array(gray_img) # 2. 读取并处理LUT:提取256x1 PNG中每个位置的RGB值 lut_img = Image.open('LUT.png').convert('RGB') # 转为(256, 3)的数组,每个元素对应灰度0-255的RGB颜色 lut_np = np.array(lut_img).squeeze() # 移除多余维度,从(256,1,3)转为(256,3) # 3. 灰度值批量映射到LUT颜色:直接用灰度值作为索引取对应RGB color_np = lut_np[gray_np] # 4. 转回PIL Image并保存 color_img = Image.fromarray(color_np.astype(np.uint8)) color_img.save('output.jpg')
关键优势
- 高效快速:用Numpy索引完成批量映射,比Matplotlib色图处理快数倍,适配树莓派的资源限制
- 逻辑准确:完全匹配Photoshop导出的256x1水平LUT规则(最左像素对应最暗灰度值)
- 精简操作:无需将灰度图转成RGB,直接用单通道做索引,节省内存与计算量
验证提示
- 确保LUT的PNG无alpha通道,所以用
convert('RGB')读取 - 如果LUT是垂直排列,需调整顺序:
lut_np = lut_np[::-1].squeeze()
内容的提问来源于stack exchange,提问作者Roman Holtwick
相关产品推荐
相关产品推荐

