用于检测损坏图像的 Python 脚本

Aji*_*kya 8 python jpeg image python-imaging-library python-3.6

我编写了一个 python 脚本来检测损坏的图像并对其进行计数,我的脚本中的问题是它检测到所有图像并且不检测损坏的图像。如何解决这个问题。我提到:

如何检查文件是否是有效的图像文件?对于我的代码

我的代码

import os
from os import listdir
from PIL import Image
count=0
for filename in os.listdir('/Users/ajinkyabobade/Desktop/2'):
    if filename.endswith('.JPG'):
     try:
      img=Image.open('/Users/ajinkyabobade/Desktop/2'+filename)
      img.verify()
     except(IOError,SyntaxError)as e:
         print('Bad file  :  '+filename)
         count=count+1
         print(count)
Run Code Online (Sandbox Code Playgroud)

Fab*_*lao 11

我在这里添加了另一个 SO 答案,它扩展了 PIL 解决方案以更好地检测损坏的图像。我还在GitHub 上的Python 脚本中实现了这个解决方案。

我还验证了损坏的文件(jpg)通常不是“损坏的”图像,即损坏的图片文件有时仍然是合法的图片文件,原始图像丢失或更改,但您仍然可以加载它。

为了完整性,我引用另一个答案:

您可以使用 Python Pillow (PIL) 模块和大多数图像格式来检查文件是否是有效且完整的图像文件。

如果您的目标是检测损坏的图像,@Nadia Alramli 正确地建议了该im.verify()方法,但这并不能检测到所有可能的图像缺陷,例如,im.verify不能检测到截断的图像(大多数查看器通常会加载灰色区域)。

Pillow也能够检测这些类型的缺陷,但您必须应用图像处理或图像解码/重新编码或触发检查。最后我建议使用这段代码:

try:
  im = Image.load(filename)
  im.verify() #I perform also verify, don't know if he sees other types o defects
  im.close() #reload is necessary in my case
  im = Image.load(filename) 
  im.transpose(PIL.Image.FLIP_LEFT_RIGHT)
  im.close()
except: 
  #manage excetions here
Run Code Online (Sandbox Code Playgroud)

如果图像有缺陷,此代码将引发异常。请考虑到 im.verify 比执行图像操作快大约 100 倍(我认为翻转是更便宜的转换之一)。使用此代码,您将以大约 10 MB/秒(现代 2.5Ghz x86_64 CPU)的速度验证一组图像。

对于其他格式psdxcf、.. 可以使用Imagemagick包装器Wand,代码如下:

im = wand.image.Image(filename=filename)
temp = im.flip;
im.close()
Run Code Online (Sandbox Code Playgroud)

但是,从我的实验来看,Wand 没有检测到截断的图像,我认为它会在没有提示的情况下将缺少的部分加载为灰色区域。

我红色的是Imagemagick有一个外部命令标识可以完成这项工作,但我还没有找到以编程方式调用该函数的方法,并且我还没有测试这条路线。

我建议始终执行初步检查,检查文件大小不为零(或非常小),是一个非常便宜的想法:

statfile = os.stat(filename)
filesize = statfile.st_size
if filesize == 0:
  #manage here the 'faulty image' case
Run Code Online (Sandbox Code Playgroud)

  • 新版本 PIL 的更新:在 `im = Image.open(...)` 之后,使用 `im.load()` 而不是转置操作。这也捕获了截断的图像异常,并且似乎比执行实际的图像转换更快。 (2认同)

sha*_*.lo 1

你正在构建一条糟糕的道路

img=Image.open('/Users/ajinkyabobade/Desktop/2'+filename)      
Run Code Online (Sandbox Code Playgroud)

请尝试以下操作(通过将 / 添加到目录路径的末尾)

img=Image.open('/Users/ajinkyabobade/Desktop/2/'+filename)      
Run Code Online (Sandbox Code Playgroud)

或者

img=Image.open(os.path.join('/Users/ajinkyabobade/Desktop/2', filename))
Run Code Online (Sandbox Code Playgroud)

  • .JPG 是有效的扩展名。您可以使用 if filename.upper().endswith('.JPG')` 来捕获两者 (2认同)