如何将cv2.read()返回结果输出到文件及可视化图像数组?TensorFlow方法咨询
我来帮你搞定这两个关于OpenCV图像数组的问题,都是日常处理中很常见的场景:
1. 正确将
cv2.imread()返回的数组输出到文件 首先得解释下你遇到的乱码问题:im.dump()是numpy的二进制序列化方法,它把数组以字节形式直接写入文件,用文本编辑器打开自然是乱码——它本来就不是给人直接看的,而是用来通过numpy.load()还原数组的。下面给你几种实用的输出方式:
- 方式一:保存为可读的文本格式(适合小尺寸图像)
用numpy.savetxt()可以把数组转成人类可读的文本,不过需要先把3D图像数组(H×W×C)转成2D格式(H*W×C),因为savetxt只支持2D及以下数组:
import cv2 import numpy as np im = cv2.imread("your_image.jpg") # 把图像展平为2D数组,用逗号分隔保存为整数格式(像素值是0-255的整数) np.savetxt("output.txt", im.reshape(-1, im.shape[-1]), fmt="%d", delimiter=",") # 读取回来的方法 loaded_im = np.loadtxt("output.txt", delimiter=",").reshape(im.shape)
- 方式二:保存为高效的二进制格式(推荐,适合所有尺寸图像)
用numpy自带的np.save()和np.load(),这是专门为numpy数组设计的读写方式,既节省空间又速度快,还原的数组和原数组完全一致:
import cv2 import numpy as np im = cv2.imread("your_image.jpg") # 保存为.npy二进制文件 np.save("image_array.npy", im) # 读取还原数组 loaded_im = np.load("image_array.npy")
- 方式三:直接保存数组的字符串形式(适合小图像快速查看结构)
如果想直接在文本文件里看到数组的完整结构,可以用np.array2string()转成字符串再写入:
import cv2 import numpy as np im = cv2.imread("your_image.jpg") with open("output.txt", "w") as f: f.write(np.array2string(im, separator=", ")) # 读取的话需要用eval解析字符串,注意大图像不推荐,解析速度很慢 with open("output.txt", "r") as f: loaded_im = np.array(eval(f.read()))
2. 可视化图像数组(含TensorFlow方法)
可视化的方法分两类:直接用OpenCV/Matplotlib的常规方法,以及TensorFlow生态下的方法,下面分别介绍:
常规可视化方法
- 用OpenCV自带的窗口显示
注意OpenCV读取的图像是BGR通道顺序,cv2.imshow()会自动适配这个顺序,所以直接显示就能看到正确颜色:
import cv2 im = cv2.imread("your_image.jpg") cv2.imshow("Loaded Image", im) cv2.waitKey(0) # 按下任意键关闭窗口 cv2.destroyAllWindows()
- 用Matplotlib显示(更灵活,适合排版)
Matplotlib默认用RGB通道顺序,所以需要先把BGR转成RGB:
import cv2 import matplotlib.pyplot as plt im = cv2.imread("your_image.jpg") im_rgb = cv2.cvtColor(im, cv2.COLOR_BGR2RGB) plt.imshow(im_rgb) plt.axis("off") # 隐藏坐标轴 plt.show()
TensorFlow相关的可视化方法
- 转成PIL图像显示
用tf.keras.preprocessing.image.array_to_img可以把numpy数组直接转成PIL图像,然后调用系统默认的图像查看器打开:
import cv2 import tensorflow as tf im = cv2.imread("your_image.jpg") # 先把BGR转成RGB,符合TensorFlow/PIL的通道习惯 im_rgb = cv2.cvtColor(im, cv2.COLOR_BGR2RGB) # 转成PIL图像并显示 pil_img = tf.keras.preprocessing.image.array_to_img(im_rgb) pil_img.show()
- 用TensorBoard可视化(适合训练过程中监控图像)
如果是在TensorFlow训练流程里,想把图像写入TensorBoard查看,可以这样做:
import cv2 import tensorflow as tf im = cv2.imread("your_image.jpg") im_rgb = cv2.cvtColor(im, cv2.COLOR_BGR2RGB) # TensorBoard要求输入是4D张量(batch_size, H, W, C),所以增加batch维度 im_tensor = tf.expand_dims(im_rgb, axis=0) # 写入日志文件 writer = tf.summary.create_file_writer("./image_logs") with writer.as_default(): tf.summary.image("Sample Input Image", im_tensor, step=0) # 之后在命令行运行:tensorboard --logdir=./image_logs,打开浏览器就能看到图像
注意:如果你的数组是归一化到[0,1]或[-1,1]的浮点型,可视化前需要先转回到0-255的uint8类型,比如用tf.clip_by_value(im_normalized * 255, 0, 255)再转成tf.uint8。
内容的提问来源于stack exchange,提问作者Liu Hantao
相关产品推荐
相关产品推荐

