一个简单的图片找茬工具

大家来找茬应该大部分人都玩过吧,最近网上看到个图片找茬的活动,给出一张jpg图片文件,其中内容是左右两边各一张相似的图片,中间有白色的背景作为间隔,需要找出两张图的不同之处,由于自己眼力不行于是就想通过程序来实现。本文就来介绍一下这个简单的找茬程序,我称之为imageDiffer。源代码可在https://github.com/Excelight/imageDiffer 找到

需求

根据传入的一张jpg图片(包含左右各一张图),显示出两张图片的不同之处

工具

  • 语言:python
  • lib: Pillow,一个python图像处理库

流程

1. 图片分割

这一步,我们需要将传入的图片分割成两个大小相同的图片,作为后续找不同的基础。这一步我们使用了最简单的方式就是,直接对半分,可以使用Image.crop函数

from PIL import Image, ImageChops
im = Image.open(path)
#拆分成左右两个
width, height = im.size
imLeft = im.crop(0, 0, width/2, height)
imRight = im.crop(width/2, 0, width, height)

2. 背景去除

由于第1步得到的结果存在一些边框,而且左侧图片的边框在右边,右侧图片的边框在左边,这将导致两张图片没有办法直接做比较,所以需要把边框去除,这可以用到ImageChops这个类中的几个方法,我们写一个imageTrim函数,专门用来去除边框

def imageTrim(imageIn, bgColor):
    # 创建一张纯背景色的图
    imBg = Image.new(imageIn.mode, imageIn.size, bgColor)
    # 生成背景图和目标图的差异图,如果像素点颜色一样,那么差异图中就是纯黑色(0,0,0)
    diff = ImageChops.difference(imageIn, imBg)
    # 由于边框的颜色并非纯色,可能有一些早点,add可以用来去除早点
    diff = ImageChops.add(diff, diff, scale=2.0, offset=-100)  # you may adjust scale or offset here if necessary
    # 获取包含有内容的边框,即去除了diff中纯黑的边框
    bbox = diff.getbbox()
    if bbox:
        return imageIn.crop(bbox)

3. 比较差异

第2步结束后,我们就得到了两张大小一模一样且像素点可以一一对应上的图。接着就很简单了,使用ImageChops.difference就能看到两幅图片的差异了。

Image.Chops.difference(imLeft, imRight).show()

最后

通过以上的几个主要步骤就能实现这个简单的找茬工具了,当然这个版本还太简单,后续可以支持图片大小边框不均匀等特性。另外需要注意的是开头提到的github中的代码和以上代码略微有些差异,增加了一些工程化的内容。

comments powered by Disqus