当前位置: 首页 > news >正文

playwright+python 实现图片对比

def compare_image(expect_path, actual_path, output_path, color_diff_threshold=10.0,max_diff_pixels=100):# 读取图片img1 = cv2.imread(expect_path)img2 = cv2.imread(actual_path)if img1.shape != img2.shape:img2 = cv2.resize(img2, (img1.shape[1], img1.shape))# ---------------------- 颜色差异对比(LAB空间) ----------------------# 转换为LAB颜色空间(更贴近人类视觉)img1_lab = cv2.cvtColor(img1, cv2.COLOR_BGR2LAB)img2_lab = cv2.cvtColor(img2, cv2.COLOR_BGR2LAB)# 计算色差(欧氏距离)color_diff = np.sqrt(np.sum((img1_lab - img2_lab) ** 2, axis=2))mean_color_diff = np.mean(color_diff)if mean_color_diff > color_diff_threshold:# 增强色差可视化(将差异值映射到0-255)color_diff_vis = (color_diff * 255 / np.max(color_diff)).astype(np.uint8)cv2.imwrite(output_path, color_diff_vis)raise ValueError(f"颜色差异过大:{mean_color_diff:.2f} > {color_diff_threshold}")# ---------------------- 像素差异对比(灰度空间) ----------------------# 灰度化 + 模糊处理gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)blur1 = cv2.GaussianBlur(gray1, (5, 5), 0)blur2 = cv2.GaussianBlur(gray2, (5, 5), 0)# 计算像素差异diff = cv2.absdiff(blur1, blur2)_, thresh = cv2.threshold(diff, 25, 255, cv2.THRESH_BINARY)# 统计显著差异像素数diff_pixels = np.sum(thresh == 255)if diff_pixels > max_diff_pixels:# 标记差异区域(红框)contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)result = img2.copy()for cnt in contours:# if cv2.contourArea(cnt) > min_contour_area:x, y, w, h = cv2.boundingRect(cnt)cv2.rectangle(result, (x, y), (x + w, y + h), (0, 0, 255), 2)cv2.imwrite(output_path, result)raise ValueError(f"差异像素数超过阈值:{diff_pixels} > {max_diff_pixels}")

1、准备好基线图(expect_path)

2、playwright打开页面,截取元素图片(actual_path)

3、直接将基线图和实际元素图片传入对比方法对比,当差异超过预期,则会在实际元素图片上红框标记出差异部分保存到output_path

需要注意的是:

如果是表单截图,则需要等待所有的字段都加载完

如果是图片预览截图,则需要等待图片彻底打开到最大

http://www.dtcms.com/a/363556.html

相关文章:

  • Linux 进程信号补充知识点总结(按重要程度排序)
  • 立足稳联技术的Ethernet IP转ModbusTCP网关与触摸屏连接案例的专业研判
  • Web3 出海香港 101 |BuildSpace AMA 第一期活动高亮观点回顾
  • C++全局变量未初始的和已初始化的位置放在哪里?
  • Web3兴起:重新定义互联网格局
  • 强化学习PPO/DDPG算法学习记录
  • 图像编码之摄像机的H264 分块编码的含义是什么,以分块编码(tile)192X192为例子说明,好处与缺点分别是什么
  • Day19(前端:JavaScript基础阶段)
  • Linux笔记14——shell编程基础-8
  • 解决戴尔笔记本电脑键盘按键部分失灵
  • 未来工厂雏形:基于Three.js的自主演进式数字孪生系统设计
  • Qwen3-Reranker-0.6B 模型结构
  • Coze平台指南(2):开发环境的搭建与配置
  • Cisco FMC利用sftp Server拷贝文件方法
  • Ubuntu中配置JMmeter工具
  • 从零开始:用代码解析区块链的核心工作原理
  • Ubuntu 24.04 服务器配置MySQL 8.0.42 三节点集群(一主两从架构)安装部署配置教程
  • 软件设计师——软件工程学习笔记
  • 矩阵scaling预处理介绍
  • AI代码生成神器终极对决:CodeLlama vs StarCoder vs Codex,谁才是开发者的「最佳拍档」?
  • STM32CUBEMX配置LAN8720a实现UDP通信
  • 【C++游记】红黑树
  • 嵌入式C语言之链表冒泡排序
  • Java基础第9天总结(可变参数、Collections、斗地主)
  • 深入浅出数据库事务:从原理到实践,解决 Spring 事务与外部进程冲突问题
  • github下载的文件内容类似文件哈希和存储路径原因
  • Kafka 分层存储(Tiered Storage)从 0 到 1 的配置、调优与避坑
  • Vue3 实现自定义指令点击空白区域关闭下拉框
  • 【51单片机】【protues仿真】 基于51单片机智能电子秤系统
  • 工业界实战之数据存储格式与精度