python之对比两张图像的相似度

news2024/11/13 9:36:55

python之图像背景识别

本着结合实际工作,实际落地并已应用的态度去码文。

python之对比两张图像的相似度

需求:在某个手机端项目中,有多个页面图片,但每个图片都做了相应的修改,由于这种图片非常多,高达上万张,每周有新的内容出现且需要回归。

在某些特定的节点,不允许相邻两张出现一模一样的图片,如果人去判定,非常非常耗时,于是需要自动化筛选,人工复核。

得,又接了一个非专业技能内的活,咋办,硬着头皮上?

那肯定不行,因为我不会;

但专业职场人怎么能说自己不会,不能!你得说,我可以学!

于是乎,我开始查找资料开始学习,找了一大圈,发现,AirTest里面就有这么一个API能够满足我的需求。拿来吧你,嘿嘿~

大致捋一下,所有页面图片通过自动化进行截图,在某些特定节点对图片命名中加入下划线作为区分,单独拿出特定节点的图片进行两两比较。

请添加图片描述

代码如下:[增加了日志追加写入并换行记录]

makeFolderResult方法为创建日志文件夹。

writeLog方法为将对比失败的图片名称写入日志中。[该日志将会直接写入目标图片路径根目录]

imageCompare方法为实际对比逻辑,阈值范围为0~1,越接近1表示图片相似度越高。

from airtest.aircv.cal_confidence import *

def makeFolderResult(imgPath, logName):
    logFloder = os.path.join(imgPath, f'图片对比结果')
    os.mkdir(logFloder)
    logPath = os.path.join(imgPath, f'图片对比结果/{logName}')
    return logPath

def wirteLog(msg, logPath):
    with open(logPath, "a+", encoding='utf-8') as f:
        f.write(msg)
        f.write("\n")

def imageCompare(imagePath, logPath,threshold:int):
    '''
    :param imagePath: 图片存放的路径
    :param logPath: 日志存放的路径
    :param threshold: 阈值,指定int类型
    :return: 
    '''
    needCompareImgDict = {}
    for root, dirs, files in os.walk(imagePath):
        for file in files:
            if "_" in file:
                key = str(file).split("_")[0]
                if key not in needCompareImgDict.keys():
                    needCompareImgDict[key] = [os.path.join(root, file)]
                else:
                    tempList = needCompareImgDict[key]
                    tempList.append(os.path.join(root, file))
                    needCompareImgDict[key] = tempList
    #### 遍历字典,将同个ID下的图片进行对比
    for imgs in needCompareImgDict.values():
        for i in range(len(imgs) - 1):
            img_1_path = imgs[i]
            img_2_path = imgs[i + 1]
            img_1_Name = img_1_path.split("\\")[-1]
            img_2_Name = img_2_path.split("\\")[-1]
            img1 = cv2.resize(cv2.imread(img_1_path), (370, 800)) # 图片尺寸根据实际图片写入
            img2 = cv2.resize(cv2.imread(img_2_path), (370, 800))
            confidence = cal_ccoeff_confidence(img1, img2)
            if confidence > threshold:
                writeMsg = f"【对比失败】,疑似 {img_1_Name}{img_2_Name} 两张图片一致,相似度为:{round(confidence * 100, 2)}%"
                wirteLog(writeMsg, logPath)
                print(writeMsg)
            else:
                pass

if __name__ == '__main__':
    imagePath = "填入你图片存放的路径"
    logName = str(imagePath.split("\\")[-1]) + ".txt"
    logPath = makeFolderResult(imagePath, logName)
    imageCompare(imagePath, logPath)

cal_ccoeff_confidence这个API是核心,源码如下:

import cv2
import numpy as np
from .utils import img_mat_rgb_2_gray


def cal_ccoeff_confidence(im_source, im_search):
    """求取两张图片的可信度,使用TM_CCOEFF_NORMED方法."""
    # 扩展置信度计算区域
    im_source = cv2.copyMakeBorder(im_source, 10,10,10,10,cv2.BORDER_REPLICATE)
    # 加入取值范围干扰,防止算法过于放大微小差异
    im_source[0,0] = 0
    im_source[0,1] = 255

    im_source, im_search = img_mat_rgb_2_gray(im_source), img_mat_rgb_2_gray(im_search)
    res = cv2.matchTemplate(im_source, im_search, cv2.TM_CCOEFF_NORMED)
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)

    return max_val

有兴趣的小伙伴可以自己研究,没兴趣的如果遇到了,拿来就直接用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/68510.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

澳亚通过聆讯:上半年营收近3亿美元 元气森林与新希望乳业是股东

雷递网 雷建平 12月6日澳亚集团有限公司(简称:“澳亚集团”)日前通过聆讯,准备在港交所上市。澳亚集团是2022年10月中旬递交招股书,不到2个月时间,澳亚集团就通过上市聆讯,这在最近两年的港交所…

小型扫雪机结构设计

目 录 摘 要 I ABSTRACT II 1、绪论 1 1.1 选题意义 1 1.2小型扫雪机国内发展现状 1 1.2.1国内小型扫雪机械现状 1 1.2.2犁式小型扫雪机 2 1.2.3旋切式小型扫雪机 2 1.2.4国内小型扫雪机械的发展方向 3 1.3国外道路小型扫雪机械技术发展概况 3 1.3.1综合式扫雪 3 1.3.2融雪扫雪…

【华为上机真题 2022】数组组成的最小数字

🎈 作者:Linux猿 🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊! &…

深入探索 Kubernetes 网络模型和网络通信

Kubernetes 定义了一种简单、一致的网络模型,基于扁平网络结构的设计,无需将主机端口与网络端口进行映射便可以进行高效地通讯,也无需其他组件进行转发。该模型也使应用程序很容易从虚拟机或者主机物理机迁移到 Kubernetes 管理的 pod 中。 …

PR-39 TFA 是富含脯氨酸和精氨酸的天然抗菌肽

PR-39 TFA 是富含脯氨酸和精氨酸的天然抗菌肽,是一种非竞争性,可逆和变构的蛋白酶体 (proteasome) 抑制剂。PR-39 TFA 可逆地结合到蛋白酶体的 α7 亚基上,并通过泛素-蛋白酶体途径阻断 NF-κB 抑制剂 IκBα 的降解。PR-39 TFA 刺激小鼠的血…

Java中的final关键字,你清楚吗?

前言 在学习Java基础阶段应该都认识关键字 final,在声明常量和匿名内部类时都会用到它。我们最熟悉的 String 类就是 final类,如果经常查看API源码,肯定还会遇到其他 final类。本篇就来深入了解一下关键字 final,加深对它的运用。 概览 可用…

java计算机毕业设计ssm线上拍卖系统设计6luor(附源码、数据库)

java计算机毕业设计ssm线上拍卖系统设计6luor(附源码、数据库) 项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff0…

CRC 循环冗余检验【计网必考】

CRC 循环冗余检验作为一个重点,也是数据链路层必考的一个考点,所以我把差错检测单独拿出来分析一起看一下。总结不易,一个简单的攒,Thanks♪(・ω・)ノ 目录 一、介绍及工作原理 二、校验计算过程…

zookeeper四字命令_java培训

zookeeper支持某些特定的四字命令,他们大多是用来查询ZK服务的当前状态及相关信息的, 通过telnet或nc向zookeeper提交相应命令,如:echo ruok | nc 127.0.0.1 2181 运行公式:echo 四字命令 | nc 主机IP zookeeper端口…

一文读懂Linux内存分配策略

转载:一文读懂Linux内存分配策略-今日头条 (toutiao.com) 在 Linux 操作系统中,虚拟地址空间的内部又被分为内核空间和用户空间两部分,不同位数的系统,地址空间的范围也不同。比如最常见的 32 位和 64 位系统,如下所示…

r语言中对LASSO回归,Ridge岭回归和弹性网络Elastic Net模型实现

原文链接:http://tecdat.cn/?p3795Glmnet是一个通过惩罚最大似然关系拟合广义线性模型的软件包。正则化路径是针对正则化参数λ的值网格处的lasso或Elastic Net(弹性网络)惩罚值计算的(点击文末“阅读原文”获取完整代码数据&…

[附源码]JAVA毕业设计社区图书馆借阅管理系统(系统+LW)

[附源码]JAVA毕业设计社区图书馆借阅管理系统(系统LW) 项目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项…

【微服务】版本确认完成,传统方式安装Nacos

目录安装Nacos1.4.1【微服务】SpringCloud和SpringBoot版本选择 【微服务】传统方式安装Nacos 安装Nacos1.4.1 Github地址:https://github.com/alibaba/nacos/releases Nacos1.4.1版本下载地址:https://github.com/alibaba/nacos/releases/download/1.…

170-本地WIFI测试环境配置IP

前几天的时候 博客被删了好多好多篇 算一下 现在是169 按道理的话应该总数是1169的 但是现在只剩下1157了 所以就是被删除了12篇 算了 问题不大 被删了就被删了吧 最近心情真的很不好 五月份的事情一直到现在还是没有走出来 我估计可能要等到下一次自己赚到钱了之后…

基于轨迹优化的自动驾驶汽车跟随自行车模型动力学控制(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 本次使用轨迹优化技术来控制汽车。假设汽车遵循自行车模型的动力学。为了实现稳定和安全的跟踪,我们使用了离散时间…

微信内嵌H5调用相机及支付相关问题

前言 进来项目在做公众号,遇到了一些问题及解决方案,在这里进行记录及分享,希望给大家带来一丝帮助 手机上控制台调试我建议使用vConsole(npm install vconsole) 微信内嵌H5的相机调用 微信内嵌H5我们需要调用扫码功能,则需要用…

如何发布WMS/WMTS离线地图服务

介绍: WMTS(OpenGIS Web Map Tile Service)当前版本是1.0.0。WMTS标准定义了一些操作,这些操作允许用户访问切片地图。WMTS可能是OGC首个支持RESTful访问的服务标准。 WMTS的原理和操作 如果知道一个请求的边界范围&#x…

浅谈用Redis实现分布式锁的方案及细节

前言 我们都知道,在面对并发问题时,有加锁操作和保证原子操作两种解决方案。当我们采用加锁操作的时候,因为Redis多采用集群的方式部署,因此我们就需要考虑到锁在分布式系统中使用的注意事项。接下来就看看Redis的分布式锁问题。…

【檀越剑指大厂—Spring】Spring高阶篇

一.基础概念 1.模块 2.Spring 框架概述。 Spring 是轻量级的开源的 JavaEE 框架 Spring 可以解决企业应用开发的复杂性 Spring 有两个核心部分: IOC 和 AOP IOC:控制反转,把创建对象过程交给 Spring 进行管理 Aop:面向切面,不修改源代码进行功能增强…

SpringBoot办公管理系统oa人力人事办公(含源码+论文+答辩PPT等)

项目功能简介: 本项目含代码详细讲解视频,手把手带同学们敲代码从0到1完成项目 该项目采用技术SpringBoot、SpringMvc(接入层框架)Spring(中间层框架)Hibernate(持久层框架)JPAMD5加密、Tomcat服务器、MySQL数据库 项目含有源码、配套开发软件…