使用tf.image.resize调整图片后用cv2.imwrite保存报错求助
问题解决:TensorFlow resize后用OpenCV保存图片报错
报错根本原因
tf.image.resize返回的是TensorFlow的Tensor对象,而OpenCV的cv2.imwrite仅接受numpy数组或OpenCV原生的UMat类型,类型不匹配导致报错。同时原代码还存在两个潜在问题:
- 输出图片无文件后缀,OpenCV无法识别保存格式
- Tensor输出为float32类型,不符合图片保存的uint8(0-255整数)要求
解决方案及修改后代码
直接对Tensor做类型转换,并补充文件后缀,代码如下:
j=0 for i in images: skyr_img = imread(my_data_dir+'/'+str(i)) skyr_img = tf.image.resize(skyr_img, [171,256], antialias=True, method='bilinear') # 1. 将Tensor转换为numpy数组,同时转为图片要求的uint8类型 skyr_img_np = skyr_img.numpy().astype('uint8') # 可选:如果不需要透明通道(4通道转3通道),取消下面注释 # skyr_img_np = skyr_img_np[..., :3] print(skyr_img_np.shape, j) # 2. 添加文件后缀,4通道图片用.png(JPG不支持透明通道) cv2.imwrite(my_data_dir+'/train/img'+str(j)+'.png', skyr_img_np) j += 1
关键改动说明
.numpy()转换:将TensorFlow的Tensor对象转为numpy数组,满足OpenCV的输入要求astype('uint8'):把resize后生成的float32浮点值转为0-255的整数像素值,避免保存后出现黑图或格式错误- 添加文件后缀:明确保存格式,4通道RGBA图片必须用
.png,3通道图片可以用.jpg或.png - 可选通道处理:如果原图是RGBA但不需要透明通道,通过
[..., :3]截取前3个RGB通道,即可保存为JPG格式
内容的提问来源于stack exchange,提问作者Joseph
相关产品推荐
相关产品推荐

