python——幾種截圖對比方式!


本次記錄的幾種截圖對比方式,主要是為了在進行手機自動化測試時,通過截圖對比來判斷測試的正確性,方式如下:

# -*- coding: utf-8 -*- 

'''
用途:利用python實現多種方法來實現圖像識別 
author:SYW
'''
 import cv2 
import numpy as np 
from matplotlib import pyplot as plt 
    
# 最簡單的以灰度直方圖作為相似比較的實現 
def classify_gray_hist(image1,image2,size = (256,256)): 
    # 先計算直方圖 # 幾個參數必須用方括號括起來 # 這里直接用灰度圖計算直方圖,所以是使用第一個通道, # 也可以進行通道分離后,得到多個通道的直方圖 # bins 取為16 
    image1 = cv2.resize(image1,size) 
    image2 = cv2.resize(image2,size) 
    hist1 = cv2.calcHist([image1],[0],None,[256],[0.0,255.0]) 
    hist2 = cv2.calcHist([image2],[0],None,[256],[0.0,255.0]) 
 # 可以比較下直方圖 
    plt.plot(range(256),hist1,'r') 
    plt.plot(range(256),hist2,'b') 
    plt.show() 
 # 計算直方圖的重合度 
    degree = 0
    for i in range(len(hist1)): 
        if hist1[i] != hist2[i]: 
            degree = degree + (1 - abs(hist1[i]-hist2[i])/max(hist1[i],hist2[i])) 
        else: 
            degree = degree + 1
    degree = degree/len(hist1) 
    return degree 
 # 計算單通道的直方圖的相似值 
def calculate(image1,image2): 
    hist1 = cv2.calcHist([image1],[0],None,[256],[0.0,255.0]) 
    hist2 = cv2.calcHist([image2],[0],None,[256],[0.0,255.0]) 
   # 計算直方圖的重合度 
    degree = 0
    for i in range(len(hist1)): 
        if hist1[i] != hist2[i]: 
            degree = degree + (1 - abs(hist1[i]-hist2[i])/max(hist1[i],hist2[i])) 
        else: 
            degree = degree + 1
    degree = degree/len(hist1) 
    return degree 
    
# 通過得到每個通道的直方圖來計算相似度 
def classify_hist_with_split(image1,image2,size = (256,256)): 
    # 將圖像resize后,分離為三個通道,再計算每個通道的相似值 
    image1 = cv2.resize(image1,size) 
    image2 = cv2.resize(image2,size) 
    sub_image1 = cv2.split(image1) 
    sub_image2 = cv2.split(image2) 
    sub_data = 0
    for im1,im2 in zip(sub_image1,sub_image2): 
        sub_data += calculate(im1,im2) 
    sub_data = sub_data/3
    return sub_data 
 # 平均哈希算法計算 
def classify_aHash(image1,image2): 
    image1 = cv2.resize(image1,(8,8))    #cv2.resize(源,目標,變換方法),將圖片變換成想要的尺寸
    image2 = cv2.resize(image2,(8,8)) 
    gray1 = cv2.cvtColor(image1,cv2.COLOR_BGR2GRAY)   #cv2.cvtColor(input_image,flag)實現圖片顏色空間的轉換,flag 參數決定變換類型。如 BGR->Gray flag 就可以設置為 cv2.COLOR_BGR2GRAY 。
    gray2 = cv2.cvtColor(image2,cv2.COLOR_BGR2GRAY) 
    hash1 = getHash(gray1) 
    hash2 = getHash(gray2) 
    return Hamming_distance(hash1,hash2) 
    
def classify_pHash(image1,image2): 
    image1 = cv2.resize(image1,(32,32)) 
    image2 = cv2.resize(image2,(32,32)) 
    gray1 = cv2.cvtColor(image1,cv2.COLOR_BGR2GRAY) 
    gray2 = cv2.cvtColor(image2,cv2.COLOR_BGR2GRAY) 
   # 將灰度圖轉為浮點型,再進行dct變換 
    dct1 = cv2.dct(np.float32(gray1)) 
    dct2 = cv2.dct(np.float32(gray2)) 
 # 取左上角的8*8,這些代表圖片的最低頻率 
    # 這個操作等價於c++中利用opencv實現的掩碼操作 # 在python中進行掩碼操作,可以直接這樣取出圖像矩陣的某一部分 
    dct1_roi = dct1[0:8,0:8] 
    dct2_roi = dct2[0:8,0:8] 
    hash1 = getHash(dct1_roi) 
    hash2 = getHash(dct2_roi) 
    return Hamming_distance(hash1,hash2) 
    
#輸入灰度圖,返回hash 
def getHash(image): 
    avreage = np.mean(image)   #np.mean()求取均值
    hash = [] 
    for i in range(image.shape[0]): 
        for j in range(image.shape[1]): 
            if image[i,j] > avreage: 
                hash.append(1) 
            else: 
                hash.append(0) 
    return hash
  
  
# 計算漢明距離 
def Hamming_distance(hash1,hash2): 
    num = 0
    for index in range(len(hash1)): 
        if hash1[index] != hash2[index]: 
            num += 1
    return num  #返回值越小,圖片相似度越高 if __name__ == '__main__': 
    img1 = cv2.imread('E:\\p1\\1.png',cv2.IMREAD_COLOR)     #讀入圖片,共2個參數,第一個參數為要讀入的圖片文件名,第二個參數為如何讀取圖片,包括cv2.IMREAD_COLOR讀入一幅彩色圖片,cv2.IMREAD_UNCHANGED讀入一幅彩色圖片,並包括alpha通道,cv2.IMREAD_GRAYSCALE已灰度模式讀入圖片
    img2 = cv2.imread('E:\\p2\\2.png',cv2.IMREAD_COLOR) 
    c_img1 = img1[200:400, 500:800]     #截取圖片的某一部分
    c_img2 = img2[200:400, 500:800]     #syw,[200:400]控制的是高度,[500:800]控制的是長度,500代表的是x1,800代表的是x2
    cv2.imshow('img1',c_img1)        #創建一個窗口顯示圖片,共2個參數,第一個參數為”窗口顯示圖片的標題“可以創建多個窗口,但每個窗口都不能重名,第二個參數為讀入的圖片
    cv2.imshow('img2',c_img2) 
    #degree = classify_gray_hist(img1,img2) 
    #degree = classify_hist_with_split(img1,img2) 
    #degree = classify_pHash(img1,img2)    #syw
    #degree = classify_pHash(c_img1,c_img2) 
    degree = classify_aHash(c_img1,c_img2) 
    print degree 
    if degree == 0 or degree <10:
        print "pass"
    else:
        print "fail"
    cv2.waitKey(0)    #鍵盤綁定函數。共一個函數,表示等待毫秒數,將等待特定的幾毫秒,看鍵盤是否有輸入,返回值是ASCII值,如果其參數為0,則表示無限期的等待鍵盤輸入
    cv2.destroyAllWindows()  #刪除建立的全部窗口
    #cv2.destroyWindows():        #刪除指定的窗口

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM