检测损坏图像的python脚本

Python Script to detect broken images

我写了一个python脚本来检测损坏的图像并计算它们,我的脚本中的问题是它检测所有图像,而不检测损坏的图像。如何修复此问题。我指的是:

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

我的密码

1
2
3
4
5
6
7
8
9
10
11
12
13
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)


你正在建设一条不好的道路

1
img=Image.open('/Users/ajinkyabobade/Desktop/2'+filename)

请尝试以下操作

1
img=Image.open('/Users/ajinkyabobade/Desktop/2/'+filename)

1
img=Image.open(os.path.join('/Users/ajinkyabobade/Desktop/2', filename))


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

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

我引用了另一个完整的答案:

您可以使用大多数图像格式的python-bellow(pil)模块来检查文件是否是有效且完整的图像文件。

如果您的目标是检测也被破坏的图像,@nadia alramli正确地建议使用im.verify()方法,但这并不能检测所有可能的图像缺陷,例如,im.verify不检测被截断的图像(大多数观看者通常使用灰色区域加载)。

枕头也能检测到这些类型的缺陷,但你必须应用图像处理或图像解码/重编码或触发检查。最后,我建议使用以下代码:

1
2
3
4
5
6
7
8
9
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

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

对于其他格式PSD、XCF等。您可以使用ImageMagick包装棒,代码如下:

1
2
3
im = wand.image.Image(filename=filename)
temp = im.flip;
im.close()

但是,从我的实验中,魔杖并没有检测到截短的图像,我认为它在没有提示的情况下将缺少的部分加载为灰色区域。

我知道imagemagick有一个外部命令identify,它可以生成该作业,但是我没有找到一种以编程方式调用该函数的方法,我也没有测试过这个路由。

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

1
2
3
4
statfile = os.stat(filename)
filesize = statfile.st_size
if filesize == 0:
  #manage here the 'faulty image' case