前提
前陣子報了個班,學(xué)了一些android UI自動化相關(guān)的東西,于是想到第一家單位在做android手機自動化的時候,有用到圖片對比檩小,來確定是否點到指定的頁面开呐,遂想在appium+python做UI自動化時,也能夠圖片對比來判定是否到了指定頁面规求,也算是另一種斷言方式筐付。
說干就干,上網(wǎng)一搜果然有一個第三方庫可以處理圖片 傳送門 阻肿,這篇文章算是一個學(xué)習(xí)小結(jié)瓦戚,先了解一些基本的語法,后面準(zhǔn)備用到android UI自動化中
簡單介紹
首先安裝同其他第三方庫丛塌,直接 pip install pillow ,from PIL import Image 如果沒有報錯則說明安裝成功
Pillow中最重要的類就是Image较解,可以通過以下幾種方式實例化:從文件中讀取圖片,處理其他圖片得到新圖片赴邻,直接創(chuàng)建一個圖片印衔。
我這邊僅僅是用到了直接打開圖片,然后進行對比姥敛,所以其他不多做介紹
使用Image模塊中的open函數(shù)打開一張圖片:
image1= Image.open(pic1)
對比圖片的時候用到了一個像素奸焙,img1.histogram() ,這個函數(shù)會返回一個列表彤敛,里面是每個坐標(biāo)像素點的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: 返回對比的結(jié)果
'''
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我這邊就根據(jù)我的理解玄糟,簡單解釋一下計算過程吧
首先histogram得到的結(jié)果是一個列表[ ]
list(map(lambda a,b: (a-b)**2,histogram1, histogram2))
這個表達式獲得結(jié)果是 一個 histogram1[i] - histogram2[i] 相減的結(jié)果平方的新的列表
即: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)
這個函數(shù)返回的就是 a=(h3[1]+h3[2]+......+h3[n])/n
math.sqrt(a)這個就很容易理解啦袄秩,就是把a開2次方
最后得到differ,如果兩張圖 一模一樣那么最終結(jié)果differ應(yīng)該是0茶凳,即differ越小嫂拴,圖片越相似(甚至相同),differ越大贮喧,圖片差異越大