You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 15:53:13