TensorFlow图片预处理:io.imread与cv2.imread读取差异及resize裁剪详解
本文详解TensorFlow中图片预处理的两类常用方法。对比io.imread与cv2.imread在RGB/BGR存储格式上的区别,以及transform.resize与cv2.resize在数值范围(0-1与0-255)和数据类型(float64与uint8)上的差异。结合tfrecord数据集制作场景,提供通道转换与格式转换的具体代码实现,帮助开发者选择合适的数据加载策略。
TensorFlow图片预处理概述
方式一:使用skimage库
方式一:skimage库读取与处理
from skimage import data, io, transform, color
import matplotlib.pyplot as plt
# io.imread 读出的图片格式是uint8,value是numpy array 类型。
image = data.coffee()
image = io.imread(dir)
plt.imshow(image)
plt.show()
io.save('1.jpg',image) #保存图像
image_gray = color.rgb2gray(image) #转换为灰度图像
io.save('2.jpg',image_gray)
# 通过transform.resize()裁剪后的图片是以 float64的格式存储的,数值的取值范围是(0~1)
image_ = transform.resize(image,(200,200))
img = image_ * 255 #将图片的取值范围改成(0~255)
img = img.astype(np.uint8)
img = image_ * 255 #将图片的取值范围改成(0~255)
img = img.astype(np.uint8)
方式二:使用cv2库
方式二:cv2库读取与处理
import cv2
import matplotlib.pyplot as plt
# cv2.imread读出的图片格式是uint8,value也是numpy array 类型。
# 图像数据格式是以BGR的格式进行存储的。需要将存储类型改成RGB 的形式才能正常显示原图的颜色。
image=cv2.imread(dir)
b,g,r = cv2.split(image) #将图像通道分离开
rgb_image = cv2.merge([r,g,b]) #以RGB的形式重新组合
#image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) 也可以使用这个函数直接转换成RGB 形式
plt.imshow(rgb_image)
# 通过cv2.resize()裁剪后的图片还是以 numpy array 的方式保存的, 数值的取值范围是(0~255)
image_cv2 = cv2.resize(rgb_image)
image=cv2.imread(dir)
b,g,r = cv2.split(image) #将图像通道分离开
rgb_image = cv2.merge([r,g,b]) #以RGB的形式重新组合
#image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) 也可以使用这个函数直接转换成RGB 形式
plt.imshow(rgb_image)
# 通过cv2.resize()裁剪后的图片还是以 numpy array 的方式保存的, 数值的取值范围是(0~255)
image_cv2 = cv2.resize(rgb_image)
补充说明:TensorFlow中io.imread与cv2.imread的读取区别,以及transform.resize与cv2.resize的裁剪差异
在TensorFlow模型训练前,图片预处理是必要环节,其中读取和裁剪是最基础的两个步骤。常见的读取和裁剪方式各有两种,本文将分享这些方式的具体实现及其核心区别。
一、两种常见的图片读取方式:io.imread()与cv2.imread()
1. 使用io.imread()读取的图片格式为uint8,返回值为numpy array类型。对于RGB图像,数据以RGB格式存储。

2. 使用cv2.imread()读取的图片格式同样为uint8,返回值也是numpy array类型。主要区别在于,cv2默认以BGR格式存储图像数据。若需正常显示原图颜色,需将存储类型转换为RGB。特别是在制作tfrecord数据集时,必须确保图片通道为RGB,具体代码参考。
cv2读取与RGB转换示例
import cv2
import matplotlib.pyplot as plt
from skimage import transform
import numpy as np
import skimage.io as io
train_dir = 'E:/TensorFlow/Project_TF/flower_tfrecord/data/test/roses/timg.jpg'
'''以cv2方式读取图片'''
image=cv2.imread(train_dir)
b,g,r = cv2.split(image) #将图像通道分离开
rgb_image = cv2.merge([r,g,b]) #以RGB的形式重新组合
#image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) 也可以使用这个函数直接转换成RGB 形式
plt.imshow(rgb_image)
'''以io.imread方式读取图片'''
#image = io.imread(train_dir) #读图并显示
#plt.imshow(image)
二、两种常见的图片裁剪方式:cv2.resize()与transform.resize()
1. 使用cv2.resize()裁剪后的图片仍以numpy array形式保存,数值取值范围为0至255。

2. 使用transform.resize()裁剪后的图片以float64格式存储,数值取值范围为0至1。在制作tfrecord数据集时,通常需要将其转换回numpy array形式,具体代码参考。
transform裁剪与格式转换示例
'''以io.imread方式读取图片并使用transform形式裁剪图片'''
image = io.imread(train_dir) #读图并显示
plt.imshow(image)
image =transform.resize(image, (208, 208))
img = image * 255 #将图片的取值范围改成(0~255)
img = img.astype(np.uint8)
plt.imshow(img)
读取和裁剪图片是制作tfrecord数据集的基础步骤。后续文章将进一步更新如何制作自定义tfrecord数据集及其读取方法。如有疏漏,欢迎指正。
以上关于TensorFlow中图片读取和裁剪方式的分享到此结束,希望能提供有益参考,欢迎支持。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













