【问题标题】:Comparing 2 images/pictures by using PIL, some doesn't work使用 PIL 比较 2 个图像/图片,有些不起作用
【发布时间】:2014-11-25 15:38:06
【问题描述】:

我正在使用 PIL 比较 2 张图像/图片。下面的代码适用于一些图片,但不是全部。

from PIL import Image
from PIL import ImageChops
from PIL import ImageDraw

im1 = Image.open(r'c:\a.jpg')
im2 = Image.open(r'c:\aa.jpg')

diff = ImageChops.difference(im2, im1).getbbox()

print diff

draw = ImageDraw.Draw(im2)
draw.rectangle(diff)
im2 = im2.convert('RGB')
im2.save(r'c:\aaa.jpg')

例如,这两张图片就不行了。

.jpg

aa.jpg

输出是 (16, 80, 80, 144) 但是它没有在图片上绘制任何东西。

问题:

  1. 为什么会这样?
  2. 文件类型重要吗?即 JPG 与 JPG 比较; PNG与PNG比较; BMP 与 BMP 的比较——哪种格式最适合比较?
  3. 有时差异在于图片上的远距离,因此它会绘制一个大矩形以包含整个区域。有没有办法只绘制小矩形来标记差异?

谢谢。

【问题讨论】:

  • 你的矩形调用需要颜色吗?
  • 在openCV包中,您可以根据强度差异抓取各个区域的变化。入门:opencvpython.blogspot.ca/2012/06/…
  • 你确定它没有画出任何东西,也许可以通过矩形的颜色来检查,draw.rectangle(diff, outline = (0,255,0))
  • 谢谢,user1269942。我会阅读教程。
  • @Marcin,感谢您的提示。有人知道PNG、JPG、BMP等文件格式是否重要吗?

标签: python image python-imaging-library


【解决方案1】:
from PIL import Image
from PIL import ImageChops
from PIL import ImageDraw

im1 = Image.open('a.jpg')
im2 = Image.open('aa.jpg')

diff = ImageChops.difference(im2, im1).getbbox()

print diff

draw = ImageDraw.Draw(im2)
draw.rectangle(diff, outline = (0,255,0))
print  help(draw.rectangle)
im2 = im2.convert('RGB')
im2.save('aaa.jpg')

模块 PIL.ImageDraw 中的方法 rectangle 帮助:

rectangle(self, xy, fill=None, outline=None) 方法 PIL.ImageDraw.ImageDraw 实例

所以 outline 参数默认是 None 这就是它在这里创建透明矩形的原因。

【讨论】:

  • 谢谢。它解决了这个问题。实际上它们完全相同但被认为不同,是否有一种不那么“敏感”的方式来比较图片?我的意思是只有图片相同的不同才能被视为不同。
  • 如果您要进行图像比较或搜索图像上的任何对象等,我真的建议您使用 opencv。 stackoverflow.com/questions/4196453/…
猜你喜欢
  • 2020-10-18
  • 2011-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多