使用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
相关产品推荐
相关产品推荐

