python比较两张图片是否一样_python 判断 图片是否相同

import os

from PIL import Image

from PIL import ImageFile

import imagehash

#仅适用于图片内容完全相同,而尺寸不同的比较

def compare_image(img_file1, img_file2):

if img_file1 == img_file2:

return True

fp1 = open(img_file1, 'rb')

fp2 = open(img_file2, 'rb')

img1 = Image.open(fp1)

img2 = Image.open(fp2)

ImageFile.LOAD_TRUNCATED_IMAGES = True

b = img1 == img2

fp1.close()

fp2.close()

return b

#通过图片hash值进行比较

def get_hash_dict(dir):

hash_dict = {}

image_quantity = 0

for _, _, files in os.walk(dir):

for i, fileName in enumerate(files):

with open(dir + fileName, 'rb') as fp:

hash_dict[dir + fileName] = imagehash.average_hash(Image.open(fp))

image_quantity += 1

return hash_dict, image_quantity

def compare_image_with_hash(image_file_name_1, image_file_name_2, max_dif=0):

"""

max_dif: 允许最大hash差值, 越小越精确,最小为0

推荐使用

"""

ImageFile.LOAD_TRUNCATED_IMAGES = True

hash_1 = None

hash_2 = None

with open(image_file_name_1, 'rb') as fp:

hash_1 = imagehash.average_hash(Image.open(fp))

with open(image_file_name_2, 'rb') as fp:

hash_2 = imagehash.average_hash(Image.open(fp))

dif = hash_1 - hash_2

if dif < 0:

dif = -dif

if dif <= max_dif:

return True

else:

return False

def compare_image_dir_with_hash(dir_1, dir_2, max_dif=0):

"""

max_dif: 允许最大hash差值, 越小越精确,最小为0

用于比较两个文件夹内的图片

"""

ImageFile.LOAD_TRUNCATED_IMAGES = True

hash_dict_1, image_quantity_1 = get_hash_dict(dir_1)

hash_dict_2, image_quantity_2 = get_hash_dict(dir_2)

if image_quantity_1 > image_quantity_2:

tmp = image_quantity_1

image_quantity_1 = image_quantity_2

image_quantity_2 = tmp

tmp = hash_dict_1

hash_dict_1 = hash_dict_2

hash_dict_2 = tmp

result_dict = {}

for k in hash_dict_1.keys():

result_dict[k] = None

for dif_i in range(0, max_dif + 1):

have_none = False

for k_1 in result_dict.keys():

if result_dict.get(k_1) is None:

have_none = True

if not have_none:

return result_dict

for k_1, v_1 in hash_dict_1.items():

for k_2, v_2 in hash_dict_2.items():

sub = (v_1 - v_2)

if sub < 0:

sub = -sub

if sub == dif_i and result_dict.get(k_1) is None:

result_dict[k_1] = k_2

break

return result_dict

def main():

print(compare_image('image1\\815.jpg', 'image2\\5.jpg'))

print(compare_image_with_hash('image1\\815.jpg', 'image2\\5.jpg', 6))

r = compare_image_dir_with_hash('image1\\', image2\\', 10)

for k in r.keys():

print(k, r.get(k))

if __name__ == '__main__':

main()

运行结果:

False

True

image2\5.jpg image1\815.jpg

image2\6.jpg image1\819.jpg

image2\7.jpg image1\900.jpg

image2\8.jpg image1\998.jpg

image2\9.jpg image1\1012.jpg

图片例子

815.jpg

1043898-20180110180003941-1601370471.jpg

5.jpg

1043898-20180110180034035-1951768962.jpg

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 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表示两张图片越相似。 需要注意的是,为了得到准确的相似度值,我们需要确保两张图片在尺寸上相同,以及选择合适的比较算法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值