需求背景
运营的同事提了个需求:货源审核人员每天要审核货源的照片,查看一个照片,检查其是否是以前货源已经使用过的,这个工作机械、高度重复,希望能做个程序自动比对,把可能重复/相似的图片找出来。
需求分析
对这个需求做了分析后,有一下结论:
- 图片可能是完全一样的,只是格式不同,png,jpeg, gif几种格式
- 图片可能是相似的,只是经过了放缩、剪裁
- 图片可能是相似的,经过了简单的涂鸦
- 图片可能是相似/一样的,但是做了旋转
做这个程序不是要百分百找出重复图片,只需要找出大部分可能重复图片即可大幅度减少重复劳动。
解决办法
使用different hash算法,计算两张图片的hash距离,如果距离小于一个阈值,则认为其相似度太高。
安装PIL
yum install -y python-devel
wget http://effbot.org/downloads/Imaging-1.1.7.tar.gz
tar xvfz Imaging-1.1.7.tar.gz
cd Imaging-1.1.7
找到 setup.py 这个文件,修改下面几行代码(默认TCL_ROOT的设置为NONE,这里要传到系统库的路径才行):
TCL_ROOT = "/usr/lib64/"
JPEG_ROOT = "/usr/lib64/"
ZLIB_ROOT = "/usr/lib64/"
TIFF_ROOT = "/usr/lib64/"
FREETYPE_ROOT = "/usr/lib64/"
LCMS_ROOT = "/usr/lib64/"
执行安装:
python setup.py install
安装dhash
pip install dhash
使用PIL 计算dhash
import dhash
from PIL import Image
image = Image.open('dhash-test.jpg')
row, col = dhash.dhash_row_col(image)
print(dhash.format_hex(row, col))
使用 ImageMagick 计算dhash (需要安装ImageMagick)
import dhash
from wand.image import Image
with Image(filename='dhash-test.jpg') as image:
row, col = dhash.dhash_row_col(image)
print(dhash.format_hex(row, col))
-
dhash的说明 https://github.com/Jetsetter/dhash
-
一个有深度解决办法 老司机带你检测相似图片