赞
踩
在 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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。