import numpy as np
import cv2 as cv
from decimal import Decimal, getcontext
def image_comparison(local_img_path, screenshot_img_path):
# 真实截图
screenshot_img = cv.imread(screenshot_img_path)
# 读取本地图片,作为预期图片
local_img = cv.imread(local_img_path)
# 确保两张图片的尺寸和颜色空间一致
if local_img.shape != screenshot_img.shape:
raise ValueError("两张图片尺寸或颜色空间不一致,无法比较")
# 将图片转换为灰度图进行比较
local_img_gray = cv.cvtColor(local_img, cv.COLOR_BGR2GRAY)
screenshot_img_gray = cv.cvtColor(screenshot_img, cv.COLOR_BGR2GRAY)
# 缩放图片以计算相似度 原尺寸是1280*720 缩小尺寸可以减少计算量提高处理速度
resized_local_img = cv.resize(local_img_gray, (250, 250))
resized_screenshot_img = cv.resize(screenshot_img_gray, (250, 250))
# 计算两张图片的相似度
similarity = cv.matchTemplate(resized_local_img, resized_screenshot_img, cv.TM_CCOEFF_NORMED)
value = np.max(similarity)
# 设置小数点后的精度 全局设置
getcontext().prec = 7 # 包括整数部分在内的总位数,即保留6位小数
# 转换为 Decimal,并进行运算
value = Decimal(float(value)) # 先转换为float类型,否则会报错
value = value.quantize(Decimal('0.000001'))
print(value)
# 计算原始尺寸图片的差异
difference = cv.absdiff(local_img_gray, screenshot_img_gray)
_, threshold = cv.threshold(difference, 30, 255, cv.THRESH_BINARY)
# 使用膨胀操作扩大差异区域
kernel = np.ones((5, 5), np.uint8)
dilated = cv.dilate(threshold, kernel, iterations=1)
# 在原图上标记差异
contours, _ = cv.findContours(dilated, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
for contour in contours:
(x, y, w, h) = cv.boundingRect(contour)
cv.rectangle(local_img, (x, y), (x + w, y + h), (0, 0, 255), 2)
cv.imshow('Diff', local_img)
cv.waitKey(0)
cv.destroyAllWindows()
OpenCV常用的函数
import cv2
import numpy as np
from PIL import Image
from io import BytesIO
from decimal import Decimal, getcontext
def image_opencv(image1_path):
#读取图片
img = cv2.imread(image1_path)
# 获取模板图像的宽度和高度
w, h = img.shape[1], img.shape[0]
#缩放
resized_image = cv2.resize(img, (250, 250))
#旋转
flipped = cv2.flip(img, -1) # 1表示水平翻转 0表示垂直翻转 -1表示水平垂直翻转
# 计算两张图片的相似度
similarity = cv2.matchTemplate(img, img, cv2.TM_CCOEFF_NORMED)
value = np.max(similarity)
# 将 OpenCV 图像转换为字节流--再将字节流转换为图片
_, buffer = cv2.imencode('.png', img)
image_bytes = np.array(buffer).tobytes()
img = np.array(Image.open(BytesIO(image_bytes)))
#颜色空间转换
#将图像从 BGR 转换为 RGB 颜色空间
rgb_image = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
#灰度图 忽略颜色信息 减少计算量
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#给图片上绘制矩形
cv2.rectangle(img, (100, 100), (200, 200), (0, 255, 0), 2)
#给图片中添加文本
cv2.putText(img, 'Hello', (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)
#模糊
blurred = cv2.blur(img, (5, 5))
#边缘检测
edges = cv2.Canny(gray, 50, 150)
cv2.imshow('Image', img)
# cv2.imshow('Image', rgb_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
#将修改后的图片保存到本地
cv2.imwrite('output.jpg', img)
背景:在进行ui自动化测试时,因为所有的操作是在canvals画布内的操作,页面内没有dom元素可以进行断言,只能通过预期图片和实际操作图片比对的方式进行断言;所以在本地执行时先将预期图片保存下来,正式执行时将执行完成后的结果和预期图片进行比对,比对有差异的地方被标记出来,并计算相似度相似度最大1.0 ,如下相似度是0.949626的对比图