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

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

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

  • 9
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 可以使用 Python 的 PIL 库来对比两张图片相似度。首先,需要使用 PIL 库打开两张图片,然后将它们转换为相同的模式(例如 RGB 或 L)。接下来,可以使用 PIL 库的“difference”方法来计算两张图片的差异值,然后使用 Python 的内置函数“sum”来计算差异值的总和。最后,可以使用这个总和来计算两张图片相似度。 以下是一个示例代码: ```python from PIL import Image # 打开两张图片 image1 = Image.open('image1.jpg') image2 = Image.open('image2.jpg') # 转换为相同的模式 image1 = image1.convert('RGB') image2 = image2.convert('RGB') # 计算差异值 difference = Image.difference(image1, image2) # 计算差异值的总和 difference_sum = sum(difference.getdata()) # 计算相似度 similarity = 100 - (difference_sum / 255.0 * 100) print('Similarity:', similarity) ``` 在这个示例代码中,我们首先使用 PIL 库打开了两张图片,然后将它们转换为相同的模式(RGB)。接下来,我们使用 PIL 库的“difference”方法来计算两张图片的差异值,然后使用 Python 的内置函数“sum”来计算差异值的总和。最后,我们使用这个总和来计算两张图片相似度。 ### 回答2: 要比较两张图的相似度,可以使用Python中的图像处理库OpenCV。以下是一个使用OpenCV计算两张图像相似度的示例代码: ```python import cv2 # 加载两张图像 img1 = cv2.imread('image1.jpg') img2 = cv2.imread('image2.jpg') # 调整图像尺寸为相同大小(如果需要) img1 = cv2.resize(img1, (300, 300)) img2 = cv2.resize(img2, (300, 300)) # 转换图像为灰度图 gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) # 计算图像的结构相似度指数(SSIM) ssim = cv2.SSIM(gray1, gray2) # 打印相似度 print("图像相似度:", ssim) ``` 请确保将代码中`image1.jpg`和`image2.jpg`替换为你要比较的真实图像文件路径。`cv2.resize`函数可以根据需要调整图像的大小。计算出的相似度以浮点数形式返回,范围从0到1,1表示完全相似,0表示完全不同。 另外,还可以使用其他方法来计算图像相似度,如通过计算图像的直方图或特征点匹配等。具体的方法选择取决于你对相似度的定义和应用场景的要求。 ### 回答3: 要比较两张图的相似度,可以使用Python中的图像处理库OpenCV来实现。以下是一个基本的代码示例,用于比较两张图像相似度: ```python import cv2 # 读取两张要比较的图像 img1 = cv2.imread('image1.jpg') img2 = cv2.imread('image2.jpg') # 将图像转换为灰度图 gray_img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) gray_img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) # 初始化ORB特征检测器 orb = cv2.ORB_create() # 检测关键点和描述符 keypoints1, descriptors1 = orb.detectAndCompute(gray_img1, None) keypoints2, descriptors2 = orb.detectAndCompute(gray_img2, None) # 初始化暴力匹配器 bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) # 使用匹配器比较两幅图像的特征描述符 matches = bf.match(descriptors1, descriptors2) # 根据匹配结果排序 matches = sorted(matches, key=lambda x: x.distance) # 计算图像相似度 similarity = len(matches) / len(keypoints1) * 100 print("图像相似度:", similarity) ``` 这段代码中,我们首先使用OpenCV的`imread()`函数读取了两张要比较的图像。然后,将图像转换为灰度图以便进行特征提取。我们使用ORB特征检测器来检测关键点和计算特征描述符。接下来,使用暴力匹配器来比较两幅图像的特征描述符,并根据匹配结果进行排序。最后,通过计算匹配的特征数量与关键点数量的比值,得到了图像相似度。 请注意,这只是一个基本的代码示例,实际上图像相似度的比较方法有很多种,可以根据实际需求选择合适的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值