当前位置: 首页 > 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.xdnf.cn/news/1430083.html

相关文章:

  • 【代码里的英雄传】Dubbo 的一生:一位分布式勇士的传奇旅程
  • 依托深兰科技AI技术生态,深兰教育携手沪上高校企业启动就业科创营
  • 高性能接口实现方案
  • 【微服务】-Gson反序列化泛型类型踩坑指南:如何正确处理Result<T>类型
  • MTK Linux DRM分析(三十)- MTK mtk_dsi.c(Part.2)
  • AI零售创业公司:零眸智能
  • PHP操作LibreOffice将替换变量后的word文件转换为PDF文件
  • ffmpeg 安装
  • C#基础(⑤ProcessStartInfo类和Process类)
  • Centos10虚拟机安装Zabbix
  • 面试tips--MySQLRedis--Redis 有序集合用跳表不用B+树 MySQL用B+树作为存储引擎不用跳表:原因如下
  • 卫朋:基于IPD思维的产品规划逻辑
  • Android Binder 驱动 - Media 服务启动流程
  • 三格电子CAN总线通信原理及在消防领域中的应用
  • 第三章:生活重构:当程序员不再只是“码农“
  • 威科夫与强化学习状态
  • @Apache Hive 介绍部署与使用详细指南
  • 跨越产业技术障碍、创新制造模式的智慧工业开源了
  • HiMarket:开源AI中台革命——企业智能化的新基建
  • 从全球视角到K8s落地的Apache IoTDB实战
  • 2025年渗透测试面试题总结-47(题目+回答)
  • C++入门自学Day17-- 模版进阶知识
  • [re_1] const|cap|zookper|snowflake
  • maven私有仓库配置
  • 【linux】firewall防火墙
  • 急招 MySQL / PG DBA,欢迎自荐或推荐朋友!推荐有奖!
  • Delphi 5 操作Word表格选区问题解析
  • 玩转Docker | 使用Docker部署Haptic笔记管理应用
  • Resemble Enhance:AI语音增强技术的革新之作
  • Rsync + Rsyncd 从入门到项目实战:自动化备份全攻略