python图像对比_python3 下比较图片相似度

#!/usr/bing/env python

# -*- coding: utf-8 -*-

# @author: xxx

# @date : 2018/9/27

# coding : utf-8

from PIL import Image

class CompareImage():

def calculate(self, image1, image2):

g = image1.histogram()

s = image2.histogram()

assert len(g) == len(s), "error"

data = []

for index in range(0, len(g)):

if g[index] != s[index]:

data.append(1 - abs(g[index] - s[index]) / max(g[index], s[index]))

else:

data.append(1)

return sum(data) / len(g)

def split_image(self, image, part_size):

pw, ph = part_size

w, h = image.size

sub_image_list = []

assert w % pw == h % ph == 0, "error"

for i in range(0, w, pw):

for j in range(0, h, ph):

sub_image = image.crop((i, j, i + pw, j + ph)).copy()

sub_image_list.append(sub_image)

return sub_image_list

def compare_image(self, file_image1, file_image2, size=(256, 256), part_size=(64, 64)):

'''

'file_image1'和'file_image2'是传入的文件路径

可以通过'Image.open(path)'创建'image1' 和 'image2' Image 对象.

'size' 重新将 image 对象的尺寸进行重置,默认大小为256 * 256 .

'part_size' 定义了分割图片的大小.默认大小为64*64 .

返回值是 'image1' 和 'image2'对比后的相似度,相似度越高,图片越接近,达到1.0说明图片完全相同。

'''

image1 = Image.open(file_image1)

image2 = Image.open(file_image2)

img1 = image1.resize(size).convert("RGB")

sub_image1 = self.split_image(img1, part_size)

img2 = image2.resize(size).convert("RGB")

sub_image2 = self.split_image(img2, part_size)

sub_data = 0

for im1, im2 in zip(sub_image1, sub_image2):

sub_data += self.calculate(im1, im2)

x = size[0] / part_size[0]

y = size[1] / part_size[1]

pre = round((sub_data / (x * y)), 6)

# print(str(pre * 100) + '%')

print('Compare the image result is: ' + str(pre))

return pre

compare_image = CompareImage()

compare_image.compare_image("1.jpg", "2.jpg")

识别的图片:

faa3d6cb-0cb3-4c5b-97b5-6ac7dbf106f8.jpg!large

f765eb46-f18f-4c06-a58e-2a351c6b3901.jpg!large

运行结果:

Compare the image result is: 0.379042

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值