原因:出现上面的问题一般是图片格式破损了
利用UltraEdit文本编辑器查看图片格式
打开一张图片,首先正确的格式为: 以FF D8开头,以 FF D9结尾
破损的图像开头是FF D8 结尾就是乱七八糟的
解决方法:
批量读取图片并重新保存,没错就这么简单
附代码:
import os
import cv2
# 重写保存
directory_name = 'D:/DeepLearning/dataset/VOCdevkit/VOC2022/JPEGImages/' # directory读取图片位置
save_directory_name = 'D:/DeepLearning/dataset/rewrite_picture' # save_directory保存图片位置
for filename in os.listdir(directory_name):
input_img = cv2.imread(directory_name + "/" + filename)
cv2.imwrite(save_directory_name + '/' + filename, input_img)
下午又发现一个问题,当图像格式破损比较严重,以至于无法读取,更不要提重写了,使用上面的代码读取有问题会报错
error: (-215:Assertion failed) !_img.empty() in function ‘cv::imwrite
解决办法:
将A文件夹中的图片依次读取到B文件夹,当程序意外卡住停止,这个时候看B文件夹中生成的图片,例如:如果停留在序号18,说明A文件中序号19的图片有问题,这个时候删除A文件夹中的图片19,然后继续执行,手动删除所有破损照片。这个代码我只关注了输出图片的序号out_name,可以找出破损的照片。
代码:
import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np
import random
import numpy as np
import cv2
import os
import math
import torch
from torch import nn
# 图像灰度延展、直方图均衡化
file_root = r'D:/DeepLearning/dataset/obstacle/mm/' # 当前文件夹下的所有图片
file_list = os.listdir(file_root)
save_out = r"D:/DeepLearning/dataset/obstacle/ll/" # 保存图片的文件夹名称
for img_name in file_list:
img_path = file_root + img_name
img = cv.imread(img_path, -1)#读取
# img = cv2.resize(img, (w, h))
img_norm = img.astype(np.uint8)#转换格式便于保存输出
# out_name = img_name.split('.')[0]
out_name = img_name
save_path = save_out + 'gs_' + out_name + '.png'
cv2.imwrite(save_path, img_norm)#
然后得到的B文件夹中的图片,我又用最上面的代码重写了一边