更换数据集导致错误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分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

javacv依赖太大导致jar包也大的解决办法

《javacv依赖太大导致jar包也大的解决办法》随着项目的复杂度和依赖关系的增加,打包后的JAR包可能会变得很大,:本文主要介绍javacv依赖太大导致jar包也大的解决办法,文中通过代码介绍的... 目录前言1.检查依赖2.更改依赖3.检查副依赖总结 前言最近在写项目时,用到了Javacv里的获取视频

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

Debian 13升级后网络转发等功能异常怎么办? 并非错误而是管理机制变更

《Debian13升级后网络转发等功能异常怎么办?并非错误而是管理机制变更》很多朋友反馈,更新到Debian13后网络转发等功能异常,这并非BUG而是Debian13Trixie调整... 日前 Debian 13 Trixie 发布后已经有众多网友升级到新版本,只不过升级后发现某些功能存在异常,例如网络转

GSON框架下将百度天气JSON数据转JavaBean

《GSON框架下将百度天气JSON数据转JavaBean》这篇文章主要为大家详细介绍了如何在GSON框架下实现将百度天气JSON数据转JavaBean,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言一、百度天气jsON1、请求参数2、返回参数3、属性映射二、GSON属性映射实战1、类对象映

Java Stream 并行流简介、使用与注意事项小结

《JavaStream并行流简介、使用与注意事项小结》Java8并行流基于StreamAPI,利用多核CPU提升计算密集型任务效率,但需注意线程安全、顺序不确定及线程池管理,可通过自定义线程池与C... 目录1. 并行流简介​特点:​2. 并行流的简单使用​示例:并行流的基本使用​3. 配合自定义线程池​示

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱