opencv无法读取的图像,利用pil和numpy进行修复

发布于:2025-03-28 ⋅ 阅读:(79) ⋅ 点赞:(0)

代码总结

这段代码的功能是遍历指定文件夹下的所有图像文件,并修复可能存在的格式问题,然后覆盖原图像


代码解析

  1. 设置输入文件夹路径input_folder)。
  2. 遍历文件夹中的所有文件,筛选出 .jpg.jpeg.png.webp 格式的图像文件。
  3. 逐个处理图像文件
    • 使用 PIL 读取图像,并转换为 RGB 模式(确保正确加载)。
    • PIL 读取的图像转换为 NumPy 数组,并从 RGB 变换为 OpenCV 默认的 BGR 格式。
    • 使用 cv2.imwrite() 保存处理后的图像,直接覆盖原图像
  4. 错误处理
    • 如果 cv2.imwrite() 失败,则打印保存失败信息。
    • 如果 PIL 读取图像失败(如文件损坏),则捕获异常并打印错误信息。

适用场景

  • 修复因路径编码问题导致的 OpenCV 读取失败的图片
  • 确保所有图片的颜色通道符合 OpenCV 处理方式(BGR)
  • 批量处理文件夹下的所有图片,并覆盖原图像
import os
import cv2
import numpy as np
from PIL import Image

# 设置图像所在的目录(注意使用原始字符串或正斜杠)
input_folder = r"I:\img\path

# 遍历目录下所有图像文件(可根据需要扩展格式)
for file_name in os.listdir(input_folder):
    if not file_name.lower().endswith(('.jpg', '.jpeg', '.png', '.webp')):
        continue  # 仅处理指定格式的图像

    file_path = os.path.join(input_folder, file_name)
    try:
        # 用 PIL 读取图像,并转换为 RGB 模式
        img_pil = Image.open(file_path).convert("RGB")
        # 转换为 NumPy 数组,并将颜色从 RGB 转换为 BGR(OpenCV 默认颜色顺序)
        img_cv = cv2.cvtColor(np.array(img_pil), cv2.COLOR_RGB2BGR)

        # 使用 OpenCV 保存时直接覆盖原图像
        success = cv2.imwrite(file_path, img_cv)
        if success:
            print(f"已修复并覆盖: {file_path}")
        else:
            print(f"保存失败: {file_path}")
    except Exception as e:
        print(f"处理失败: {file_path} - {e}")


网站公告

今日签到

点亮在社区的每一天
去签到