python比较两张截图相似度

需求
让电脑自动判断是否收到微信消息
思路
截图1:清屏
截图2:发送信息之后
计算两张截图的相似度
实现
截图,处理像素点并哈希化,如果两个图片不同哈希位数大于设置的阈值,则认为两张图片不相同,即:收到了微信消息

直接上代码吧,思路很简单!

#图片相似度比较
from PIL import Image
import time
from PIL import ImageGrab
import os
root_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


#计算图片hash值
def get_hash(srcimg,dstimg):
    print("当前图像的尺寸为:",dstimg.size)
    hh = srcimg.height
    ww = srcimg.width
    img = dstimg.resize((hh,ww), Image.ANTIALIAS).convert('L')#灰度处理

    print("转换图像尺寸为:",hh,ww)
    avg = sum(list(img.getdata())) /(hh*ww)  # 计算像素平均值
    s = ''.join(map(lambda i: '0' if i < avg else '1', img.getdata()))  # 每个像素进行比对,大于avg为1,反之为0
    print("一共有{}个像素点".format(len(s)))
    t=''.join(map(lambda j: '%x' % int(s[j:j+4], 2), range(0, hh*ww, 4)))#将二进制转换为16进制
    return t


#比较图片hash值
def hamming(target,x1,y1,x2,y2):
    target_path = target.split("-")[0]
    target_name = target.split("-")[1]
    # 防止截全屏的页面没反应过来
    time.sleep(1)
    global root_dir
    app_action_img = root_dir + '/APP_Action_Icons/' + target_path + "/" + target_name + '.png'
    zui=False#预设返回结果为False
    try:
        #根据给定的位置进行截图
        time.sleep(2)
        img = ImageGrab.grab(bbox=(x1, y1, x2, y2))
        time.sleep(2)
        print("截取该区间的屏幕:({},{})~({},{})".format(x1, y1, x2, y2))
        ##保存截屏位置
        Screenshot_img = root_dir + '/Screen_Shots/Test_Screen_shots/similarimg.jpg'
        img.save(Screenshot_img)
        ##等待图片保存
        time.sleep(0.5)
        #对图像哈希
        im1 = Image.open(app_action_img)
        im2 = Image.open(Screenshot_img)
        hash1=get_hash(im1,im1)
        hash2=get_hash(im1,im2)
        print("哈希值一共有{}位".format(len(hash1)))
        hh = im1.height
        ww = im1.width
        #>=98%的相似度才可以认为两个图片相同
        n = hh * ww // 200
        print("如果有{}个哈希值不同则认为两个图片不同".format(n))
        assert len(hash1) == len(hash2)
        sum=0
        for ch1, ch2 in zip(hash1, hash2):
            if ch1!=ch2:
                sum+=1
        print("不同的哈希值有{}位".format(sum))
        #比较两个hash值不同的位数,n为阈值,大于该阈值则认为两者是不同的图片
        zui= False if sum >n else True
        indenti = (hh * ww // 4 - sum) / (hh * ww // 4)

        #如果第一次没有匹配成功,则再给他一个机会
        if zui==False:
            print("两秒钟之后重新截图...")
            time.sleep(2)
            time.sleep(2)
            img = ImageGrab.grab(bbox=(x1, y1, x2, y2))
            time.sleep(2)
            print("截取该区间的屏幕:({},{})~({},{})".format(x1, y1, x2, y2))
            ##保存截屏
            Screenshot_img = root_dir + '/Screen_Shots/Test_Screen_shots/similarimg_2.png'
            img.save(Screenshot_img)
            ##等待图片保存
            time.sleep(0.5)

            im1 = Image.open(app_action_img)
            im2 = Image.open(Screenshot_img)
            hash1 = get_hash(im1, im1)
            hash2 = get_hash(im1, im2)
            print("哈希值一共有{}位".format(len(hash1)))
            hh = im1.height
            ww = im1.width
            n = hh * ww // 200
            print("如果有{}个哈希值不同则认为两个图片不同".format(n))
            assert len(hash1) == len(hash2)
            sum = 0
            for ch1, ch2 in zip(hash1, hash2):
                if ch1 != ch2:
                    sum += 1
            print("不同的哈希值有{}位".format(sum))
            # 比较两个hash值不同的位数,n为阈值,大于该阈值则认为两者是不同的图片

            zui = False if sum > n else True
            indenti=(hh*ww//4-sum)/(hh*ww//4)
    except Exception as e:
        print("相似度对比失败,请重试!", e)
    else:
        print("相似度对比成功,相似度为:",indenti)
    return zui



print(hamming('企业微信-聊天框',313,63,1915,685))

清屏截屏:
在这里插入图片描述

发送信息后截屏为:
在这里插入图片描述

运行结果为:

截取该区间的屏幕:(313,63)~(1915,685)
当前图像的尺寸为: (1302, 622)
转换图像尺寸为: 622 1302
一共有809844个像素点
当前图像的尺寸为: (1602, 622)
转换图像尺寸为: 622 1302
一共有809844个像素点
哈希值一共有202461位
如果有4049个哈希值不同则认为两个图片不同
不同的哈希值有8914位
两秒钟之后重新截图...
截取该区间的屏幕:(313,63)~(1915,685)
当前图像的尺寸为: (1302, 622)
转换图像尺寸为: 622 1302
一共有809844个像素点
当前图像的尺寸为: (1602, 622)
转换图像尺寸为: 622 1302
一共有809844个像素点
哈希值一共有202461位
如果有4049个哈希值不同则认为两个图片不同
不同的哈希值有8501位
相似度对比成功,相似度为: 0.9580116664444016
False

Process finished with exit code 0

### 回答1: Python可以使用Image模块和OpenCV库来比较两张图片的相似度。以下是一种常见的方法: 首先,使用Image模块将两张图片加载为Image对象: from PIL import Image image1 = Image.open("image1.jpg") image2 = Image.open("image2.jpg") 接下来,将图片转换为灰度图像,这样可以减少比较的复杂度: image1_gray = image1.convert("L") image2_gray = image2.convert("L") 然后,可以使用numpy库将图像转换为数组,并进行进一步的处理。使用OpenCV库计算图像的差异度量,例如均方差或结构相似性指数(SSIM): import cv2 import numpy as np array1 = np.array(image1_gray) array2 = np.array(image2_gray) # 计算均方差 mse = np.mean((array1 - array2) ** 2) # 计算结构相似性指数 ssim = cv2.SSIM(array1, array2) 最后,根据不同的应用需求,可以仅根据均方差或者结构相似性指数来判断图片的相似度。均方差越小,说明图片越相似;而结构相似性指数越接近1,说明图片越相似。 这只是其中一种比较图片相似度的方法,Python还有其他库和方法可以实现类似功能。 ### 回答2: Python可以使用一些图像处理和计算机视觉库来比较两张图片的相似度,下面我将介绍其中的几个库。 1. PIL库:Python Imaging Library(PIL)是一个用于图像处理的库,可以加载、处理和保存多种格式的图像。可以使用PIL库来计算两张图片的直方图,并通过比较直方图来判断相似度。 2. OpenCV库:OpenCV是一个开源计算机视觉库,提供了很多用于图像处理的函数和算法。可以使用OpenCV库来计算两张图片之间的结构相似性指数(SSIM),该指数可以评估两张图片在亮度、对比度和结构等方面的相似程度。 3. scikit-image库:scikit-image是一个用于图像处理的Python库,提供了很多图像处理和计算机视觉的功能。可以使用scikit-image库来计算两张图片之间的结构相似性指数(SSIM)和均方误差(MSE),从而评估图片的相似度。 4. perceptual哈希算法:perceptual哈希算法是一种可以计算图片相似度的算法,它通过计算两张图片的哈希值并比较它们的相似程度来判断图片的相似度Python中有一些开源的算法库可以使用,如DHash、AHash和PHash。 总之,Python提供了多种图像处理和计算机视觉库可以用来比较两张图片的相似度。具体选择哪个库要根据实际需求和数据特点来决定,可以根据图片的特点、计算速度和准确度等因素来选择合适的方法。 ### 回答3: 在Python中,我们可以使用OpenCV库来比较两张图片的相似度。OpenCV是一个开源的计算机视觉库,提供了一系列用于图像处理和计算机视觉任务的函数。下面是一个简单的例子来演示如何使用OpenCV比较两张图片的相似度: ```python import cv2 # 读取两张图片 image1 = cv2.imread('image1.jpg') image2 = cv2.imread('image2.jpg') # 确保两张图片有相同的尺寸 image1 = cv2.resize(image1, (200, 200)) image2 = cv2.resize(image2, (200, 200)) # 将图片转换为灰度图像 gray1 = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY) gray2 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY) # 计算两张图片的结构相似度指数(Structural Similarity Index,SSIM) ssim = cv2.compareSSIM(gray1, gray2) # 打印相似度 print("The SSIM between image1 and image2 is", ssim) ``` 上述代码中,我们首先使用`cv2.imread`函数读取两张图片,并使用`cv2.resize`函数将它们的尺寸调整为相同大小。然后,我们使用`cv2.cvtColor`函数将其转换为灰度图像,因为相似度比较通常使用灰度图像而非彩色图像。 最后,我们使用`cv2.compareSSIM`函数计算了两张图片的结构相似度指数(SSIM)。SSIM是一种用于比较两张图像相似度的指标,其值在0到1之间,值越接近1表示两张图片越相似。 需要注意的是,为了得到准确的相似度值,我们需要确保两张图片在尺寸上相同,以及选择合适的图像比较算法。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值