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