方案二 phash

phash具体的实现可以很多地方都有了,可以搜到很多差不多的内容,在这我也就简单的记录下,具体可以去谷歌或者百度搜下。

  • 缩小尺寸 为了后边的步骤计算简单些

  • 简化色彩 将图片转化成灰度图像,进一步简化计算量

  • 计算DCT 计算图片的DCT变换,得到32*32的DCT系数矩阵。

  • 缩小DCT 虽然DCT的结果是32*32大小的矩阵,但我们只要保留左上角的8*8的矩阵,这部分呈现了图片中的最低频率。

  • 计算平均值 如同均值哈希一样,计算DCT的均值。

  • 计算hash值 根据8*8的DCT矩阵,设置0或1的64位的hash值,大于等于DCT均值的设为”1”,小于DCT均值的设为“0”。组合在一起,就构成了一个64位的整数,这就是这张图片的指纹。

找到的是一个纯c的,来自 phash.org (没错,就是这么官方)。安装啥的网站里边都有,附上一个python调用的脚本。

class pHash(object):

    def __init__(self):

        self._lib = ctypes.CDLL('/opt/local/lib/libpHash.dylib', use_errno=True)

    def dct_imagehash(self, path):

        phash = ctypes.c_uint64()

        if self._lib.ph_dct_imagehash(path, ctypes.pointer(phash)):

            errno_ = ctypes.get_errno()

            err, err_msg = (errno.errorcode[errno_], os.strerror(errno_)) \

                if errno_ else ('none', 'errno was set to 0')

            print(('Failed to get image hash'

                   ' ({!r}): [{}] {}').format(path, err, err_msg), file=sys.stderr)

            return None

        return phash.value

 

    def hamming_distance(self, hash1, hash2):

        return self._lib.ph_hamming_distance(

            *map(ctypes.c_uint64, [hash1, hash2]))

链接:https://www.jianshu.com/p/c87f6f69d51f

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TigerZ*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值