更换数据集导致错误OSError: Unrecognized data stream contents when reading image file

本文主要是介绍更换数据集导致错误OSError: Unrecognized data stream contents when reading image file,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 查找错误
  • 打印错误文件并查看其二进制开头
  • 移动文件
  • 补充,将后缀是png但实际是jpg图像转换为png图像

查找错误

比如我的png格式图片要一样的开头时

def is_valid_image(path):try:bValid = Truefileobj = open(path, 'rb')  # 以二进制打开文件buf = fileobj.read()if not buf.startswith(b'\x89PNG'):  # 是否以\x89PNG开头 表示PNGbValid = Falseprint(buf)else:try:Image.open(fileobj).verify()except Exception as e:bValid = Falseexcept Exception as e:return Falsereturn bValid

jpg格式

def is_valid_image(path):try:bValid = Truefileobj = open(path, 'rb')  # 以二进制打开文件buf = fileobj.read()if not buf.startswith(b'\xff\xd8'):  # 是否以\xff\xd8开头 表示JPEG(jpg)bValid = Falseelse:try:Image.open(fileobj).verify()except Exception as e:bValid = Falseexcept Exception as e:return Falsereturn bValid

打印错误文件并查看其二进制开头

以png为例,如果不想看二进制开头可注释掉print(buf)

import os
from PIL import Image
import shutildef is_valid_image(path):try:bValid = Truefileobj = open(path, 'rb')  # 以二进制打开文件buf = fileobj.read()if not buf.startswith(b'\x89PNG'):  # 是否以\x89PNG开头 表示PNGbValid = Falseprint(buf)else:try:Image.open(fileobj).verify()except Exception as e:bValid = Falseexcept Exception as e:return Falsereturn bValiddef is_call_valid(path, move_to_path):# 遍历图像夹下所有图像 root:根目录  dirs:根目录下所有目录(文件夹):files: 包含所有图像的一个listfor root, dirs, files in os.walk(path):for img_file in files:# 组合图像的绝对路径img_file_path = os.path.join(root, img_file)# 调用图像判断函数flag = is_valid_image(img_file_path)# 判断图像是否损坏,若是则移动到失效文件路径中if flag == False:# this delete can not restore# os.remove(img_file_path)print(img_file_path)# 移动文件# shutil.move(img_file_path, move_to_path)# print(img_file_path)# is_call_valid('./dataset/train_data/ors-4199/gt','./fail ors-4199')
is_call_valid('./dataset/train_data/RSISOD/gt','./fail RSISOD')

移动文件

import os
from PIL import Image
import shutildef is_valid_image(path):try:bValid = Truefileobj = open(path, 'rb')  # 以二进制打开文件buf = fileobj.read()if not buf.startswith(b'\x89PNG'):  # 是否以\x89PNG开头 表示PNGbValid = Falseelse:try:Image.open(fileobj).verify()except Exception as e:bValid = Falseexcept Exception as e:return Falsereturn bValiddef is_call_valid(path, move_to_path):# 遍历图像夹下所有图像 root:根目录  dirs:根目录下所有目录(文件夹):files: 包含所有图像的一个listfor root, dirs, files in os.walk(path):for img_file in files:# 组合图像的绝对路径img_file_path = os.path.join(root, img_file)# 调用图像判断函数flag = is_valid_image(img_file_path)# 判断图像是否损坏,若是则移动到失效文件路径中if flag == False:# this delete can not restore# os.remove(img_file_path)# 移动文件shutil.move(img_file_path, move_to_path)# print(img_file_path)is_call_valid('./dataset/train_data/ors-4199/gt','./fail ors-4199')
is_call_valid('./dataset/train_data/RSISOD/gt','./fail RSISOD')

补充,将后缀是png但实际是jpg图像转换为png图像

from PIL import Image
import os# 设置输入文件夹路径和目标格式
input_folder = './dataset/train_data/RSISOD/gt/pool'
target_format = 'png'# 循环遍历输入文件夹中的所有文件
for filename in os.listdir(input_folder):# 检查文件是否为jpg格式fileobj = open(os.path.join(input_folder, filename), 'rb')  # 以二进制打开文件buf = fileobj.read()if not buf.startswith(b'\x89PNG'):# 组合新的文件名和路径img_path_jpg = os.path.join(input_folder, filename)img_path_png = os.path.splitext(img_path_jpg)[0] +'!'+ '.' + target_format# 读取JPG格式图片并保存为PNG格式with Image.open(img_path_jpg) as img:img.save(img_path_png)# 删除原始JPG格式图片os.remove(img_path_jpg)

这篇关于更换数据集导致错误OSError: Unrecognized data stream contents when reading image file的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/305791

相关文章

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

Java Stream流之GroupBy的用法及应用场景

《JavaStream流之GroupBy的用法及应用场景》本教程将详细介绍如何在Java中使用Stream流的groupby方法,包括基本用法和一些常见的实际应用场景,感兴趣的朋友一起看看吧... 目录Java Stream流之GroupBy的用法1. 前言2. 基础概念什么是 GroupBy?Stream

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

java如何实现高并发场景下三级缓存的数据一致性

《java如何实现高并发场景下三级缓存的数据一致性》这篇文章主要为大家详细介绍了java如何实现高并发场景下三级缓存的数据一致性,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 下面代码是一个使用Java和Redisson实现的三级缓存服务,主要功能包括:1.缓存结构:本地缓存:使

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

C#解析JSON数据全攻略指南

《C#解析JSON数据全攻略指南》这篇文章主要为大家详细介绍了使用C#解析JSON数据全攻略指南,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、为什么jsON是C#开发必修课?二、四步搞定网络JSON数据1. 获取数据 - HttpClient最佳实践2. 动态解析 - 快速

Python错误AttributeError: 'NoneType' object has no attribute问题的彻底解决方法

《Python错误AttributeError:NoneTypeobjecthasnoattribute问题的彻底解决方法》在Python项目开发和调试过程中,经常会碰到这样一个异常信息... 目录问题背景与概述错误解读:AttributeError: 'NoneType' object has no at

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

Redis中Stream详解及应用小结

《Redis中Stream详解及应用小结》RedisStreams是Redis5.0引入的新功能,提供了一种类似于传统消息队列的机制,但具有更高的灵活性和可扩展性,本文给大家介绍Redis中Strea... 目录1. Redis Stream 概述2. Redis Stream 的基本操作2.1. XADD