要比较两个图片是否完全相同,可以通过以下几个步骤来规划思路:
-
获取图片数据:首先需要将两张图片加载并获取它们的像素数据。可以使用Python中的OpenCV或PIL库等来加载和处理图片数据。
-
比较图片尺寸:在比较两张图片是否完全相同之前,可以先比较它们的尺寸是否相同。如果尺寸不同,则可以直接判定两张图片不同。
-
逐像素比较:遍历每个像素点并逐点比较它们的RGB值(或灰度值)。如果两张图片的对应像素点的RGB值完全相同,则说明对应位置的像素完全相同。
-
计算哈希值比较:通过计算图片的哈希值(如局部敏感哈希算法(pHash)、均值哈希(aHash)等),然后比较哈希值是否相等,来判断两张图片是否相同。
-
使用结构相似性比较:结构相似性比较指标(Structural Similarity Index,SSIM)可用于比较两个图片的相似性。可以计算两张图片之间的SSIM指标,并设定一个阈值判断图片差异是否在可接受范围内。
-
比较直方图:计算两张图片的直方图,并比较它们之间的差异。可以使用直方图距离度量来判断两张图片的相似度。
-
使用开源工具:除了以上方法,也可以考虑使用一些开源的图像处理工具或库,如ImageMagick、OpenCV等,它们提供了丰富的图像处理功能,包括比较图片的相似性。
测app的时候总会需要比较两个图片是否一致,以下是python实现。
import cv2
import numpy as np
import subprocess
import os
class BaseImage(object):
'''
操作图片
'''
def __init__(self, driver):
self.driver = driver
# 去掉顶部栏
def remove_top_bar(self,image):
height, width = image.shape[:2]
top_bar_height = 250 # mumu 顶部栏250
image = image[top_bar_height:height, 0:width]
return image
def image_equivalence(self,png1,png2):
'''比较两个截图是否完全相等'''
image_start = cv2.imread(png1)
image_start_cropped = self.remove_top_bar(image_start)
image_current = cv2.imread(png2)
image_current_cropped = self.remove_top_bar(image_current)
# 保存裁剪后的图片
# cv2.imwrite(png1, image_start_cropped)
# cv2.imwrite(png2, image_current_cropped)
# 判断两张裁剪后的图片是否完全一致
if image_start_cropped.shape == image_current_cropped.shape and not (np.bitwise_xor(image_start_cropped, image_current_cropped).any()):
print("两张图片完全一致!")
subprocess.call(["adb", "shell", "rm", "/sdcard/" + png1])# 删除临时生成的截图文件
subprocess.call(["adb", "shell", "rm", "/sdcard/" + png2])
os.remove(png1)
os.remove(png2)
return True
else:
print("两张图片不完全一致!")
subprocess.call(["adb", "shell", "rm", "/sdcard/" + png1])# 删除临时生成的截图文件
subprocess.call(["adb", "shell", "rm", "/sdcard/" + png2])
return False