OpenCV图像预处理报错:无法读取PNG文件问题求助
问题:运行Python图像预处理代码时出现
can't open/read file错误 问题描述
运行Python图像预处理代码时,出现can't open/read file错误,无法读取training目录下的PNG格式图像,已确认目录路径无问题,请问代码中存在什么问题?
预处理代码
import os import cv2 import numpy as np def preprocess_image(image): image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) image = cv2.bitwise_not(image) kernel = np.ones((30, 30), np.uint8) tophat = cv2.morphologyEx(image, cv2.MORPH_TOPHAT, kernel) g_kernel = cv2.getGaborKernel((350, 350), 8.0, np.pi/4, 10.0, 0.5, 0, ktype=cv2.CV_32F) h, w = g_kernel.shape[:2] g_kernel = cv2.resize(tophat, (3*w, 3*h), interpolation=cv2.INTER_CUBIC) image = cv2.bitwise_not(g_kernel) for i in range(len(image)): for j in range(len(image)): if image[i][j] > 244: image[i][j] = 0 kernel = np.ones((2, 2), np.uint8) opening = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel) return opening # 设置输入输出目录路径 input_dir = os.path.abspath("training\\") save_dir = "preprocessed_images/" # 若输出目录不存在则创建 if not os.path.exists(save_dir): os.makedirs(save_dir) # 遍历输入目录下的所有对象 for filename in os.listdir(input_dir): # 加载图像 image_path = os.path.join(input_dir, filename) image = cv2.imread(image_path) if image is None: print(f"Could not read image at {image_path}") continue # 预处理图像 preprocessed_image = preprocess_image(image) # 保存预处理后的图像 save_path = os.path.join(save_dir, filename) cv2.imwrite(save_path, preprocessed_image) print("Preprocessing complete.")
运行日志
D:\drcnn-train>python p_processing.py [ WARN:0@0.145] global D:\a\opencv-python\opencv-python\opencv\modules\imgcodecs\src\loadsave.cpp (239) cv::findDecoder imread_('D:\drcnn-train\training\0'): can't open/read file: check file path/integrity Could not read image at D:\drcnn-train\training\0 [ WARN:0@0.148] global D:\a\opencv-python\opencv-python\opencv\modules\imgcodecs\src\loadsave.cpp (239) cv::findDecoder imread_('D:\drcnn-train\training\1'): can't open/read file: check file path/integrity Could not read image at D:\drcnn-train\training\1 [ WARN:0@0.151] global D:\a\opencv-python\opencv-python\opencv\modules\imgcodecs\src\loadsave.cpp (239) cv::findDecoder imread_('D:\drcnn-train\training\2'): can't open/read file: check file path/integrity Could not read image at D:\drcnn-train\training\2 [ WARN:0@0.154] global D:\a\opencv-python\opencv-python\opencv\modules\imgcodecs\src\loadsave.cpp (239) cv::findDecoder imread_('D:\drcnn-train\training\3'): can't open/read file: check file path/integrity Could not read image at D:\drcnn-train\training\3 [ WARN:0@0.158] global D:\a\opencv-python\opencv-python\opencv\modules\imgcodecs\src\loadsave.cpp (239) cv::findDecoder imread_('D:\drcnn-train\training\4'): can't open/read file: check file path/integrity Could not read image at D:\drcnn-train\training\4 Preprocessing complete.
问题分析与解决
从日志可见,代码尝试读取的training目录下的0、1等对象是无后缀的子目录,而非PNG图片。当前代码的核心问题:
- 未过滤文件类型,会遍历目录下所有文件和子目录
- 未判断遍历对象是否为文件,直接用
cv2.imread读取文件夹,而cv2.imread无法读取文件夹,导致报错
修复方案
修改遍历逻辑,添加文件类型过滤和文件判断:
# 遍历输入目录下的所有对象 for filename in os.listdir(input_dir): image_path = os.path.join(input_dir, filename) # 跳过子目录,仅处理PNG格式文件(兼容大小写) if not os.path.isfile(image_path) or not filename.lower().endswith('.png'): continue # 加载图像 image = cv2.imread(image_path) if image is None: print(f"Could not read image at {image_path}") continue # 预处理图像 preprocessed_image = preprocess_image(image) # 保存预处理后的图像 save_path = os.path.join(save_dir, filename) cv2.imwrite(save_path, preprocessed_image)
另外,input_dir = os.path.abspath("training\\")中的双反斜杠可改为os.path.abspath("training"),写法更通用,但这不是导致当前错误的原因。
内容的提问来源于stack exchange,提问作者bun
相关产品推荐
相关产品推荐

