#encoding=utf-8
from selenium import webdriver
import unittest, time
from PIL import Image
class ImageCompare(object):
'''
本類實現了對兩張圖片通過像素比對的算法,獲取文件的像素個數大小
然后使用循環的方式將兩張圖片的所有項目進行一一對比,
並計算比對結果的相似度的百分比
'''
def make_regalur_image(self, img, size=(256, 256)):
# 將圖片尺寸強制重置為指定的size大小
# 然后再將其轉換成RGB值
return img.resize(size).convert('RGB')
def split_image(self, img, part_size=(64, 64)):
# 將圖片按給定大小切分
w, h = img.size
pw, ph = part_size
assert w % pw == h % ph == 0
return [img.crop((i, j, i + pw, j + ph)).copy() \
for i in range(0, w, pw) for j in range(0, h, ph)]
def hist_similar(self, lh, rh):
# 統計切分后每部分圖片的相似度頻率曲線
assert len(lh) == len(rh)
return sum(1 - (0 if l == r else float(abs(l - r)) / max(l, r)) \
for l, r in zip(lh, rh)) / len(lh)
def calc_similar(self, li, ri):
# 計算兩張圖片的相似度
return sum(self.hist_similar(l.histogram(), r.histogram())\
for l, r in zip(self.split_image(li), self.split_image(ri))) / 16.0
def calc_similar_by_path(self, lf, rf):
li, ri = self.make_regalur_image(Image.open(lf)), \
self.make_regalur_image(Image.open(rf))
return self.calc_similar(li, ri)
class TestDemo(unittest.TestCase):
def setUp(self):
self.IC = ImageCompare()
# 啟動瀏覽器
self.driver =webdriver.Chrome(executable_path="D:\\driver\\chromedriver")
def test_ImageComparison(self):
url="http://www.baidu.com"
# 訪問百度首頁
self.driver.get(url)
time.sleep(3)
# 截取第一次訪問搜狗首頁的圖片,並保存在本地
self.driver.save_screenshot("e:\\baidu1.png")
self.driver.get(url)
time.sleep(3)
# 截取第二次訪問搜狗首頁的圖片,並保存在本地
self.driver.save_screenshot("e:\\baidu2.png")
# 打印兩張截圖比對后相似度,100表示完全匹配
print (self.IC.calc_similar_by_path('e:\\baidu1.png','e:\\baidu2.png') * 100)
def tearDown(self):
# 退出瀏覽器
self.driver.quit()
if __name__ == '__main__':
unittest.main()

