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

时间:2017-10-20 17:38:40

标签: python image jpeg python-imaging-library python-3.6

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

我的代码

How to check if a file is a valid image file?

我的代码

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)

4 个答案:

答案 0 :(得分:1)

你正在用

构建一条糟糕的道路
img=Image.open('/Users/ajinkyabobade/Desktop/2'+filename)      

请尝试以下

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

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

答案 1 :(得分:1)

尝试以下操作:对我来说效果很好。它可以识别出不良/损坏的图像,并将其删除。或者,如果您只想打印错误/损坏的文件名,然后删除最终脚本以删除文件。

for filename in listdir('/Users/ajinkyabobade/Desktop/2/'):
    if filename.endswith('.JPG'):
        try:
            img = Image.open('/Users/ajinkyabobade/Desktop/2/'+filename)  # open the image file
            img.verify()  # verify that it is, in fact an image
        except (IOError, SyntaxError) as e:
            print(filename)
            os.remove('/Users/ajinkyabobade/Desktop/2/'+filename)

答案 2 :(得分:0)

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

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

为完整起见,我引用了另一个答案

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

如果您还打算检测损坏的图像,则@Nadia Alramli正确建议使用im.verify()方法,但是此不能检测所有可能的图像缺陷,例如{{1 }}无法检测到截断的图片(大多数观看者通常会在其中加载灰色区域)。

枕头也能够检测到此类缺陷,但是您必须在其中应用图像处理或图像解码/重新编码或触发检查。最后,我建议使用以下代码:

im.verify

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

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

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

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

我认为 Imagemagick 具有一个外部命令 identify ,该命令可以完成任务,但是我还没有找到调用该功能的方法以编程方式,我尚未测试此路线。

我建议始终执行初步检查,检查 filesize 不为零(或很小),这是一个非常便宜的主意:

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

答案 3 :(得分:0)

我收到一条错误消息,告诉我public class MyModel { [DataType(DataType.Html)] string Description {get;set;} //... other properties... } 不可用。 Image.load似乎有效。

我在使用以下命令时也遇到了错误:

Image.open

我只是将其更改为:

except (IOError, SyntaxError) as e:

效果很好。