详解Python如何批量检查图像是否可用

数据集中的图像,一般不可用在以下3个方面:

1.图像过小

2.无法打开

3.“Premature end of JPEG file”

这些图像可能会导致模型的学习异常,因此,使用多进程检查数据集中的每张图像,是很有必要的。

具体逻辑如下:

  • 遍历文件夹,多进程处理每一张图像
  • 判断图像是否可读,是否支持resize尺寸,边长是否满足
  • 判断JPG图像是否Premature end
  • 删除错误图像

脚本如下:

#!/usr/bin/env python
# -- coding: utf-8 --
"""
Copyright (c) 2020. All rights reserved.
Created by C. L. Wang on 10.11.20
"""

import argparse
import os
from multiprocessing import Pool

import cv2

def traverse_dir_files(root_dir, ext=None):
    """
    列出文件夹中的文件, 深度遍历
    :param root_dir: 根目录
    :param ext: 后缀名
    :return: [文件路径列表, 文件名称列表]
    """
    names_list = []
    paths_list = []
    for parent, _, fileNames in os.walk(root_dir):
        for name in fileNames:
            if name.startswith('.'):  # 去除隐藏文件
                continue
            if ext:  # 根据后缀名搜索
                if name.endswith(tuple(ext)):
                    names_list.append(name)
                    paths_list.append(os.path.join(parent, name))
            else:
                names_list.append(name)
                paths_list.append(os.path.join(parent, name))
    return paths_list, names_list

def check_img(path, size):
    """
    检查图像
    """
    is_good = True
    try:
        img_bgr = cv2.imread(path)
        h, w, _ = img_bgr.shape
        if h < size or w < size:
            is_good = False
        _ = cv2.resize(img_bgr, (size, size))
    except Exception as e:
        is_good = False

    if path.endswith("jpg"):
        with open(path, 'rb') as f:
            check_chars = f.read()[-2:]
        if check_chars != b'\xff\xd9':
            print('[Info] Not complete jpg image')
            is_good = False

    if not is_good:
        print('[Info] error path: {}'.format(path))
        os.remove(path)

def check_error(img_dir, n_prc, size):
    """
    检查错误图像的数量
    """
    print('[Info] 处理文件夹路径: {}'.format(img_dir))
    paths_list, names_list = traverse_dir_files(img_dir)
    print('[Info] 数据总量: {}'.format(len(paths_list)))

    pool = Pool(processes=n_prc)  # 多线程下载
    for idx, path in enumerate(paths_list):
        pool.apply_async(check_img, (path, size))
        if (idx+1) % 1000 == 0:
            print('[Info] idx: {}'.format(idx+1))

    pool.close()
    pool.join()

    print('[Info] 数据处理完成: {}'.format(img_dir))

def parse_args():
    """
    处理脚本参数,支持相对路径
    :return: in_folder 输入文件夹, size 尺寸, n_prc 进程数
    """
    parser = argparse.ArgumentParser(description='检查图片脚本')
    parser.add_argument('-i', dest='in_folder', required=True, help='输入文件夹', type=str)
    parser.add_argument('-p', dest='n_prc', required=False, default=100, help='进程数', type=str)
    parser.add_argument('-s', dest='size', required=False, default=50, help='最小边长', type=str)
    args = parser.parse_args()

    in_folder = args.in_folder
    size = int(args.size)
    n_prc = int(args.n_prc)
    print("[Info] 文件路径:{}".format(in_folder))
    print("[Info] 进程数: {}".format(n_prc))
    print("[Info] 边长: {}".format(size))

    return in_folder, n_prc, size

def main():
    arg_in, n_prc, size = parse_args()
    check_error(arg_in, n_prc, size)

if __name__ == '__main__':
    main()

到此这篇关于详解Python如何批量检查图像是否可用的文章就介绍到这了,更多相关Python检查图像内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 用python 批量更改图像尺寸到统一大小的方法

    如下所示: #提取目录下所有图片,更改尺寸后保存到另一目录 from PIL import Image import os.path import glob def convertjpg(jpgfile,outdir,width=128,height=128): img=Image.open(jpgfile) try: new_img=img.resize((width,height),Image.BILINEAR) new_img.save(os.path.join(outdir,os.pat

  • python批量压缩图像的完整步骤

    目录 背景 解决方案 操作步骤 要求 步骤 附:批量将图片的大小设置为指定大小 写在后面 背景 今天在工作中,同事遇到一个上传图片的问题:系统要求的图片大小不能超过512KB.但是同事又有很多照片.这要是每一个照片都用ps压缩的话,那岂不是很崩溃.于是我写了一个脚本,可以批量压缩图片到指定大小.直接造福同事.提高同事的工作效率. 解决方案 其实也不用卖关子了,就是使用python的pillow包就可以对图片进行压缩,如果一个图片已经压缩到指定大小了,那就停止压缩,如果没有达到指定大小,那就对压缩

  • python用opencv批量截取图像指定区域的方法

    代码如下 import os import cv2 for i in range(1,201): if i==169 or i==189: i = i+1 pth = "C:\\Users\\Desktop\\asd\\"+str(i)+".bmp" image = cv2.imread(pth) //从指定路径读取图像 cropImg = image[600:1200,750:1500] //获取感兴趣区域 cv2.imwrite("C:\\Users\

  • 详解Python如何批量检查图像是否可用

    数据集中的图像,一般不可用在以下3个方面: 1.图像过小 2.无法打开 3.“Premature end of JPEG file” 这些图像可能会导致模型的学习异常,因此,使用多进程检查数据集中的每张图像,是很有必要的. 具体逻辑如下: 遍历文件夹,多进程处理每一张图像 判断图像是否可读,是否支持resize尺寸,边长是否满足 判断JPG图像是否Premature end 删除错误图像 脚本如下: #!/usr/bin/env python # -- coding: utf-8 -- "&qu

  • 详解Python如何批量采集京东商品数据流程

    目录 准备工作 驱动安装 模块使用与介绍 流程解析 完整代码 效果展示 准备工作 驱动安装 实现案例之前,我们要先安装一个谷歌驱动,因为我们是使用selenium 操控谷歌驱动,然后操控浏览器实现自动操作的,模拟人的行为去操作浏览器. 以谷歌浏览器为例,打开浏览器看下我们自己的版本,然后下载跟自己浏览器版本一样或者最相近的版本,下载后解压一下,把解压好的插件放到我们的python环境里面,或者和代码放到一起也可以. 模块使用与介绍 selenium pip install selenium ,直

  • 详解python opencv图像混合算术运算

    目录 图片相加 cv2.add() 按位运算 图片相加 cv2.add() 要叠加两张图片,可以用 cv2.add() 函数,相加两幅图片的形状(高度 / 宽度 / 通道数)必须相同.         numpy中可以直接用res = img + img1相加,但这两者的结果并不相同(看下边代码):         add()两个图片进行加和,大于255的使用255计数.         numpy会对结果取256(相当于255+1)的模: import numpy as np import c

  • 详解Python+OpenCV进行基础的图像操作

    目录 介绍 形态变换 腐蚀 膨胀 创建边框 强度变换 对数变换 线性变换 去噪彩色图像 使用直方图分析图像 介绍 众所周知,OpenCV是一个用于计算机视觉和图像操作的免费开源库. OpenCV 是用 C++ 编写的,并且有数千种优化的算法和函数用于各种图像操作.很多现实生活中的操作都可以使用 OpenCV 来解决.例如视频和图像分析.实时计算机视觉.对象检测.镜头分析等. 许多公司.研究人员和开发人员为 OpenCV 的创建做出了贡献.使用OpenCV 很简单,而且 OpenCV 配备了许多工

  • 详解python如何通过numpy数组处理图像

    如图,以该猫咪图片为例(忽略水印).将该文件命名为cat.jpg,并对其展开以下操作. 使用PIL库进行灰度处理 from PIL import Image import numpy as np # 读取图像,并转化为数组 im = np.array(Image.open("cat.jpg")) # 灰度处理公式 gray_narry = np.array([0.299, 0.587, 0.114]) x = np.dot(im, gray_narry) # 数组转图片 gray_ca

  • 详解Python调用华为API实现图像标签

    目录 1.华为云API介绍 1.1 华为云图像标签 1.2 应用场景 1.3 调用华为云API实现图像标签 2.实验过程 2.1实验代码 2.2运行结果 2.3 问题注释 1.华为云API介绍 1.1 华为云图像标签 可识别上千种通用物体以及数百种场景标签,一个图像可包含多个标签内容,语义内容非常丰富.更智能.准确的理解图像内容,让智能相册管理.照片检索和分类.基于场景内容或者物体的广告推荐等功能更加准确. 1.2 应用场景 1.场景分析 图像标签功能可准确识别视频.图像内容,提高检索效率和精度

  • 详解Python如何实现批量为PDF添加水印

    目录 准备环境 获得经销商名字对应的列表 生成水印PDF 合并水印与目标PDF 总结 我们有时候需要把一些机密文件发给多个客户,为了避免客户泄露文件,会在机密文件中添加水印.每个客户收到的文件内容相同,但是水印都不相同.这样一来,如果资料泄露了,通过水印就知道是从谁手上泄露的. 今天,一个做市场的朋友找我咨询PDF加水印的问题,如下图所示: 他有一个Excel文件,文件里面有10000个经销商的名字,他要把价目表PDF发给这些经销商,每个经销商收到的PDF文件上面的水印都是这个经销商自己的名字.

  • 详解Python+OpenCV实现图像二值化

    目录 一.图像二值化 1.效果 2.源码 二.图像二值化(调节阈值) 1.源码一 2.源码二 一.图像二值化 1.效果 2.源码 import cv2 import numpy as np import matplotlib.pyplot as plt # img = cv2.imread('test.jpg') #这几行是对图像进行降噪处理,但事还存在一些问题. # dst = cv2.fastNlMeansDenoisingColored(img,None,10,10,7,21) # plt

  • 详解Python中图像边缘检测算法的实现

    目录 写在前面 1.一阶微分算子 1.1 Prewitt算子 1.2 Sobel算子 2.二阶微分算子 2.1 Laplace算子 2.2 LoG算子 3.Canny边缘检测 写在前面 从本节开始,计算机视觉教程进入第三章节——图像特征提取.在本章,你会见到一张简简单单的图片中蕴含着这么多你没注意到的细节特征,而这些特征将会在今后更高级的应用中发挥着极其重要的作用.本文讲解基础特征之一——图像边缘. 本文采用面向对象设计,定义了一个边缘检测类EdgeDetect,使图像边缘检测算法的应用更简洁,

  • 详解Python图像形态学处理(开运算,闭运算,梯度运算)

    目录 一.图像开运算 二.图像闭运算 三.图像梯度运算 四.总结 这篇文章将继续介绍开运算.闭运算和梯度运算.数学形态学(Mathematical Morphology)是一种应用于图像处理和模式识别领域的新方法.数学形态学(也称图像代数)表示以形态为基础对图像进行分析的数学工具,其基本思想是用具有一定形态的结构元素去量度和提取图像中对应形状以达到对图像分析和识别的目的. 一.图像开运算 开运算一般能平滑图像的轮廓,削弱狭窄部分,去掉较细的突出.闭运算也是平滑图像的轮廓,与开运算相反,它一般熔合

随机推荐