当前位置:   article > 正文

python检测图片相同部分_用 Python 实现哈希算法检测重复图片

python 判断图像中有几个重复的指定图像

在 Python 中导入 hashlib 模块,调用函数就可以生成某一个字符串或者文件的哈希值。这个算法对于未被篡改的上传文件非常有效,如果输入数据有细微变化,加密哈希算法都会导致雪崩效应,从而造成新文件的哈希值完全不同于原始文件哈希值。

import hashlib

某些情况下,我们需要检测图片之间的相似性,进行我们需要的处理:删除同一张图片、标记盗版等。

如何判断是同一张图片呢?最简单的方法是使用加密哈希(例如 MD5, SHA-1)判断。但是局限性非常大。例如一个 txt 文档,其 MD5 值是根据这个 txt 的二进制数据计算的,如果是这个 txt 文档的完全复制版,那他们的 MD5 值是完全相同的。但是,一旦改变副本的内容,哪怕只是副本的缩进格式,其 MD5 也会天差地别。比如,下面的两个字符串只是一个 . 符号的差别,MD5 却变化很大:

txt = b'The quick brown fox jumps over the lazy dog'

print(txt, hashlib.md5(txt).hexdigest())

print(txt+b'.', hashlib.md5(txt+b'.').hexdigest())

b'The quick brown fox jumps over the lazy dog' 9e107d9d372bb6826bd81d3542a419d6

b'The quick brown fox jumps over the lazy dog.' e4d909c290d0fb1ca068ffaddf22cbd0

因此加密哈希只能用于判断两个完全一致、未经修改的文件,如果是一张经过调色或者缩放的图片,根本无法判断其与另一张图片是否为同一张图片。

那么如何判断一张被PS过的图片是否与另一张图片本质上相同呢?比较简单、易用的解决方案是采用感知哈希算法(Perceptual Hash Algorithm)。

感知哈希算法是一类算法的总称,包括 aHash、pHash、dHash。顾名思义,感知哈希不是以严格的方式计算 Hash 值,而是以更加相对的方式计算哈希值,因为“相似”与否,就是一种相对的判定。

aHash:平均值哈希。速度比较快,但是常常不太精确。

pHash:余弦感知哈希。精确度比较高,但是速度方面较差一些。

dHash:差异值哈希。Amazing!精确度较高,且速度也非常快。

我们先看看一张图片:

import cv2

from IPython.display import Image

from matplotlib import pyplot as plt

%matplotlib inline

img_name = 'E:/Data/URLimg/猫/喜马拉雅猫/27.jpg'

Image(img_name)

output_6_0.jpeg

下面我们主要研究以图搜图,它最核心的东西就是怎么让电脑识别图片。为了了解以图搜图,我们先看看哈希感知算法基本原理:

把图片转成一个可识别的字符串,这个字符串也叫哈希值

和其他图片匹配字符串,通过哈希值计算两张图片的汉明距离(Hamming Distance),通过汉明距离的大小,判断两张图片的相似程度。

ahash

均值哈希算法,

模糊化处理:使用 O

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/961649
推荐阅读
相关标签
  

闽ICP备14008679号