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

使用Pillow显示TXT读取的NumPy数组图像时颜色异常

解决Pillow显示OpenCV转换图像时的颜色错误问题

问题出在哪

  • OpenCV读取图像默认采用BGR通道顺序,而Pillow的Image.fromarray()在使用'RGB'模式时,要求输入数组是RGB通道顺序,通道顺序不匹配直接导致颜色显示异常(比如蓝色会显示成红色)。
  • 你手动复制TXT内容到array变量的操作,可能存在数组格式解析错误,但颜色问题的核心还是通道顺序不匹配。

修复方法

1. 转换通道顺序(最关键)

在OpenCV读取图像后,将BGR格式转为RGB格式,从根源上解决通道顺序不兼容的问题。

2. 优化TXT读写逻辑(避免手动粘贴的坑)

手动复制数组内容到代码中容易出错,建议直接从TXT文件解析数组,省去手动操作的麻烦。

修改后的完整代码

import cv2
import sys
import numpy as np
from PIL import Image

np.set_printoptions(threshold=sys.maxsize)

def img_to_txt_array(img):
    # 读取图像并转换为RGB通道顺序
    image = cv2.imread(img)
    image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)  # 核心修复:BGR转RGB
    
    # 用repr写入数组,生成更易解析的格式,无需手动替换空格/逗号
    with open("img_array.txt", "w") as f:
        f.write(repr(image_rgb))

def show_imagem():
    # 直接从TXT读取并解析数组,避免手动粘贴错误
    with open("img_array.txt", "r") as f:
        txt_content = f.read()
        arry = np.array(eval(txt_content), dtype=np.uint8)
    
    # 创建PIL图像并显示
    image = Image.fromarray(arry, 'RGB')
    image.show()

# 生成图像数组的TXT文件
img_to_txt_array('mickey.png')
# 读取TXT并显示图像
show_imagem()

若坚持手动粘贴数组

如果一定要将TXT内容手动粘贴到array变量中,需注意两点:

  • 确保粘贴后的数组是正确的三维结构(高度×宽度×3),格式无错误
  • 必须先将OpenCV读取的BGR数组转为RGB再写入TXT,否则即使格式正确,颜色仍会异常

额外说明

  • cv2.cvtColor(image, cv2.COLOR_BGR2RGB)是解决颜色问题的核心,专门用于转换OpenCV与Pillow的通道顺序差异。
  • 使用repr()写入数组到TXT,比str()生成的字符串更规范,减少手动格式调整的工作量。
  • 用eval()解析TXT中的数组字符串,比手动处理格式更可靠,避免格式错误导致的数组解析失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 19:50:22