前提
前阵子报了个班,学了一些android UI自动化相关的东西,于是想到第一家单位在做android手机自动化的时候,有用到图片对比,来确定是否点到指定的页面,遂想在appium+python做UI自动化时,也能够图片对比来判定是否到了指定页面,也算是另一种断言方式。
说干就干,上网一搜果然有一个第三方库可以处理图片 传送门 ,这篇文章算是一个学习小结,先了解一些基本的语法,后面准备用到android UI自动化中
简单介绍
首先安装同其他第三方库,直接 pip install pillow ,from PIL import Image 如果没有报错则说明安装成功
Pillow中最重要的类就是Image,可以通过以下几种方式实例化:从文件中读取图片,处理其他图片得到新图片,直接创建一个图片。
我这边仅仅是用到了直接打开图片,然后进行对比,所以其他不多做介绍
使用Image模块中的open函数打开一张图片:
image1= Image.open(pic1)
对比图片的时候用到了一个像素,img1.histogram() ,这个函数会返回一个列表,里面是每个坐标像素点的RGB值,对比图片不同的思路,就是对比两张图片RGB值
这边的对比思路参考了 monkey 的一篇文章 图片对比 ,致谢!!!
具体代码如下:
#coding=utf-8
#author='Shichao-Dong'
from PIL import Image
import math
import operator
def compare(pic1,pic2):
'''
:param pic1: 图片1路径
:param pic2: 图片2路径
:return: 返回对比的结果
'''
image1 = Image.open(pic1)
image2 = Image.open(pic2)
histogram1 = image1.histogram()
histogram2 = image2.histogram()
differ = math.sqrt(reduce(operator.add, list(map(lambda a,b: (a-b)**2,histogram1, histogram2)))/len(histogram1))
print differ
return differ
compare(r'D:\Ptest\Testcase\11.jpg',r'D:\Ptest\Testcase\22.jpg')
这个differ我这边就根据我的理解,简单解释一下计算过程吧
首先histogram得到的结果是一个列表[ ]
list(map(lambda a,b: (a-b)**2,histogram1, histogram2))
这个表达式获得结果是 一个 histogram1[i] - histogram2[i] 相减的结果平方的新的列表
即:h3=[(h1[1]-h2[1])2,..........(h1[n]-h2[n])2](2是平方的意思,不知道怎么表达所以就这样写吧)
reduce(operator.add, list(map(lambda a,b: (a-b)**2,histogram1, histogram2)))/len(histogram1)
这个函数返回的就是 a=(h3[1]+h3[2]+......+h3[n])/n
math.sqrt(a)这个就很容易理解啦,就是把a开2次方
最后得到differ,如果两张图 一模一样那么最终结果differ应该是0,即differ越小,图片越相似(甚至相同),differ越大,图片差异越大