本次记录的几种截图对比方式,主要是为了在进行手机自动化测试时,通过截图对比来判断测试的正确性,方式如下:

# -*- coding: utf- -*- 

'''
用途:利用python实现多种方法来实现图像识别
author:SYW
''' import cv2
import numpy as np
from matplotlib import pyplot as plt # 最简单的以灰度直方图作为相似比较的实现
def classify_gray_hist(image1,image2,size = (,)):
# 先计算直方图
# 几个参数必须用方括号括起来
# 这里直接用灰度图计算直方图,所以是使用第一个通道,
# 也可以进行通道分离后,得到多个通道的直方图
# bins 取为16
image1 = cv2.resize(image1,size)
image2 = cv2.resize(image2,size)
hist1 = cv2.calcHist([image1],[],None,[],[0.0,255.0])
hist2 = cv2.calcHist([image2],[],None,[],[0.0,255.0])
# 可以比较下直方图
plt.plot(range(),hist1,'r')
plt.plot(range(),hist2,'b')
plt.show()
# 计算直方图的重合度
degree =
for i in range(len(hist1)):
if hist1[i] != hist2[i]:
degree = degree + ( - abs(hist1[i]-hist2[i])/max(hist1[i],hist2[i]))
else:
degree = degree +
degree = degree/len(hist1)
return degree # 计算单通道的直方图的相似值
def calculate(image1,image2):
hist1 = cv2.calcHist([image1],[],None,[],[0.0,255.0])
hist2 = cv2.calcHist([image2],[],None,[],[0.0,255.0])
# 计算直方图的重合度
degree =
for i in range(len(hist1)):
if hist1[i] != hist2[i]:
degree = degree + ( - abs(hist1[i]-hist2[i])/max(hist1[i],hist2[i]))
else:
degree = degree +
degree = degree/len(hist1)
return degree # 通过得到每个通道的直方图来计算相似度
def classify_hist_with_split(image1,image2,size = (,)):
# 将图像resize后,分离为三个通道,再计算每个通道的相似值
image1 = cv2.resize(image1,size)
image2 = cv2.resize(image2,size)
sub_image1 = cv2.split(image1)
sub_image2 = cv2.split(image2)
sub_data =
for im1,im2 in zip(sub_image1,sub_image2):
sub_data += calculate(im1,im2)
sub_data = sub_data/
return sub_data # 平均哈希算法计算
def classify_aHash(image1,image2):
image1 = cv2.resize(image1,(,)) #cv2.resize(源,目标,变换方法),将图片变换成想要的尺寸
image2 = cv2.resize(image2,(,))
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,(,))
image2 = cv2.resize(image2,(,))
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[:,:]
dct2_roi = dct2[:,:]
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[]):
for j in range(image.shape[]):
if image[i,j] > avreage:
hash.append()
else:
hash.append()
return hash # 计算汉明距离
def Hamming_distance(hash1,hash2):
num =
for index in range(len(hash1)):
if hash1[index] != hash2[index]:
num +=
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[:, :] #截取图片的某一部分
c_img2 = img2[:, :] #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 == or degree <:
print "pass"
else:
print "fail"
cv2.waitKey() #键盘绑定函数。共一个函数,表示等待毫秒数,将等待特定的几毫秒,看键盘是否有输入,返回值是ASCII值,如果其参数为0,则表示无限期的等待键盘输入
cv2.destroyAllWindows() #删除建立的全部窗口
#cv2.destroyWindows(): #删除指定的窗口

python——几种截图对比方式!的更多相关文章

  1. python三种数据库连接池方式

    psycopg2.pool – Connections pooling Creating new PostgreSQL connections can be an expensive operatio ...

  2. JS几种数组遍历方式以及性能分析对比

    前言 这一篇与上一篇 JS几种变量交换方式以及性能分析对比 属于同一个系列,本文继续分析JS中几种常用的数组遍历方式以及各自的性能对比 起由 在上一次分析了JS几种常用变量交换方式以及各自性能后,觉得 ...

  3. JS几种变量交换方式以及性能分析对比

    前言 "两个变量之间的值得交换",这是一个经典的话题,现在也有了很多的成熟解决方案,本文主要是列举几种常用的方案,进行大量计算并分析对比. 起由 最近做某个项目时,其中有一个需求是 ...

  4. Django,Flask,Tornado三大框架对比,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架

    Django 与 Tornado 各自的优缺点Django优点: 大和全(重量级框架)自带orm,template,view 需要的功能也可以去找第三方的app注重高效开发全自动化的管理后台(只需要使 ...

  5. ArrayList和LinkedList的几种循环遍历方式及性能对比分析(转)

    主要介绍ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性能测试对比,根据ArrayList和LinkedList的源码实现分析性能结果,总结结论. 通过本文你可以 ...

  6. ArrayList和LinkedList的几种循环遍历方式及性能对比分析

    最新最准确内容建议直接访问原文:ArrayList和LinkedList的几种循环遍历方式及性能对比分析 主要介绍ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性 ...

  7. ArrayList和LinkedList的几种循环遍历方式及性能对比分析(转载)

    原文地址: http://www.trinea.cn/android/arraylist-linkedlist-loop-performance/ 原文地址: http://www.trinea.cn ...

  8. 【转】ArrayList和LinkedList的几种循环遍历方式及性能对比分析

    原文网址:http://www.trinea.cn/android/arraylist-linkedlist-loop-performance/ 主要介绍ArrayList和LinkedList这两种 ...

  9. Java 集合 ArrayList和LinkedList的几种循环遍历方式及性能对比分析 [ 转载 ]

    Java 集合 ArrayList和LinkedList的几种循环遍历方式及性能对比分析 @author Trinea 原文链接:http://www.trinea.cn/android/arrayl ...

随机推荐

  1. Gradle初探

    (一):创建一个Gradle项目 1. 环境准备 1.1. 先上Gradle官网下载最新版的程序,地址:https://gradle.org/gradle-download/. 1.2. 配置环境变量 ...

  2. 安装VirtualBox后 不能选择64bit的系统

    之前在台式机上安装VirtualBox,一切OK,能够安装64位的任何版本iso包今天在hp笔记本上安装,安装VirtualBox完毕后,只能选择32位的iso版本. 而我目前只有一个linux64b ...

  3. 人手一份核武器 - Hacking Team 泄露(开源)资料导览手册

    https://zhuanlan.zhihu.com/p/20102713 author:蒸米 0x00 序 事先声明本人并不是全栈安全工程师,仅仅是移动安全小菜一枚,所以对泄漏资料的分析难免会有疏忽 ...

  4. Kali Linux Live USB初始化+使用日记

    1.Live USB制作官方guide:Making a Kali Bootable USB Drive:https://docs.kali.org/downloading/kali-linux-li ...

  5. ios WKWebView 与 JS 交互实战技巧

    一.WKWebView 由于Xcode8发布之后,编译器开始不支持iOS 7了,这样我们的app也改为最低支持iOS 8.0,既然需要与web交互,那自然也就选择使用了 iOS 8.0之后 才推出的新 ...

  6. Selenium2Lib库之界面元素交互常用关键字实战

    5.1 Select Radio Button单选按钮关键字 按F5 查看Select Radio Button关键字的说明,如下图: Select Radio Button [ group_name ...

  7. linux 文件传输 SCP

    SCP :secure copy (remote file copy program) 也是一个基于SSH安全协议的文件传输命令.与sftp不同的是,它只提供主机间的文件传输功能,没有文件管理的功能. ...

  8. 集成支付宝,报警告warning: (arm64) /Users/tommy/Desktop/Project/ios-msdk-git/AlipaySDK4Standard/AlipaySDK/Library/UTDI

    集成支付宝的时候遇到的问题,找到了解决办法,还说明了原因,非常好,觉得应该记下来,反正以我的记性下次一定是会忘光光哒~ 1)  Go to Build Settings -> Build Opt ...

  9. .net(C#)在Access数据库中执行sql脚本

    自己写的一个工具类,主要是业务场景的需要. 主要有两个功能: ①执行包含sql语句的字符串 ②执行包含sql语句的文件 调用方式 /// <summary> /// 执行sql语句 /// ...

  10. ubuntu18.04 & Windows10 双系统关机缓慢

    1.Windows与Ubuntu双系统关机缓慢并不少见,有时单系统下的Linux mint或Ubuntu都会出现这个现象.主要原因是还有没有关闭的进程或者是软件兼容的原因,所以导致每次关机都有一个90 ...