Python使用imagehash库生成ahash算法的示例代码

目录
  • 知识点补充
  • 前言
  • 生成 ahash
  • 向量数据库
    • 创建集合
    • 插入 ahash 到 milvus
    • 查询 ahash from milvus

知识点补充

aHash算法

Hash算法进行图片相似度识别的本质,就是将图片进行Hash转化,生成一组二进制数字,然后通过比较不同图片的Hash值距离找出相似图片。aHash中文叫平均哈希算法,顾名思义,在进行转化过程中将用到像素均值。

基本原理:

1、缩小尺寸。这样做会去除图片的细节,只保留结构、明暗等基本信息,目的是统一图片大小,保证后续图片都有相同长度的哈希值,方便距离计算。网上看到的案例基本都将尺寸缩小为8*8,64个像素点,暂时不清楚缩小为这个尺寸的原因,但如果觉得损失的信息太多,个人认为可以将尺寸适当调大,当然像素点多了后续计算就会稍慢一些。

2、灰度化处理。将图片全部转换为统一的灰度图。

3、计算像素均值。计算像素的灰度平均值(此处均值出现)。

4、哈希值计算。将每个像素的灰度,与平均值进行比较。大于或等于平均值,记为1,小于平均值,记为0,由此生成二进制数组。

5、图片配对,计算汉明距离。距离越近,越相似。当图片缩小为8*8时,通常认为汉明距离小于10的一组图片为相似图片。

前言

有一个需求:计算图片的相似度

需要解决两个问题:

  • 生成 ahash
  • 存储和计算 ahash 之间的距离

生成 ahash

『生成 ahash』 选用 python 下面的一个 imagehash 库。(github:https://github.com/JohannesBuchner/imagehash

from io import BytesIO
import numpy
import imagehash
from PIL import Image

def create_vector(file: BytesIO) -> bytes:
    image = Image.open(file)
    hash = imagehash.average_hash(image)

    _vector = []

    for h in hash.hash:
        _vector.extend(h)

    vector = bytes(
        numpy.packbits(
            [
                int(v)
                for v in _vector
            ],
            axis=-1
        ).tolist()
    )

    return vector

create_vector 函数输出的类型是 bytes,就是二进制序列

imagehash.average_hash(image) 输出的 hash 对象,hash 对象有一个 hash 属性,这个属性的类型是 list[list[bool]]打印出来就是长下面这样子,其实就是一个 8x8=64 bit 的序列

[[False False False False False False False False]
 [ True False False False  True False False False]
 [False False  True  True  True  True False False]
 [False False False  True  True False  True  True]
 [False False  True  True  True False False False]
 [False  True  True  True  True False False False]
 [False  True  True  True  True False  True  True]
 [False False False  True  True False  True  True]]

向量数据库

『存储和计算 ahash 之间的距离』选用 milvus

创建集合

定义集合:

import settings
from pymilvus import (
    connections,
    Collection,
    FieldSchema,
    CollectionSchema,
    DataType,
)
from loggers import logger

connections.connect(
    host=settings.MILVUS_CONFIG.host,
    port=settings.MILVUS_CONFIG.port,
)

schema = CollectionSchema([
    FieldSchema("id", DataType.INT64, is_primary=True, auto_id=True),
    FieldSchema("meta_id", DataType.INT64),
    FieldSchema("company_id", DataType.INT64),
    FieldSchema("image_vector", dtype=DataType.BINARY_VECTOR, dim=64)
])

# 集合不存在,则会自动创建集合;已存在,不会重复创建
collection = Collection(settings.MILVUS_CONFIG.collection.name, schema)

使用的向量类型是 dtype=DataType.BINARY_VECTOR,

为什么不选 float 是因为我不知道怎么把 ahash 转成 float

插入 ahash 到 milvus

class TestVector(unittest.TestCase):
    def test_insert_vector(self):
        """
        插入 ahash 到 milvus
        python -m unittest testing.test_milvus.TestVector.test_insert_vector
        """

        oss_file_path = 'image_hash/testing/WechatIMG193.jpeg'

        file = BytesIO(bucket.get_object(oss_file_path).read())
        vector = create_vector(file)
        m_pk = insert_vector(vector, meta_id=2, company_id=1)
        logger.debug(f'milvus pk: {m_pk}')

查询 ahash from milvus

def test_search(self):
    """
    批量调用后端接口入库
    python -m unittest testing.test_milvus.TestVector.test_search
    """
    oss_file_path = 'image_hash/testing/WechatIMG193.jpeg'

    file = BytesIO(open(BASE_DIR/'testing'/'resource'/'WechatIMG193.jpeg','rb').read())
    vector = create_vector(file)

    logger.debug(vector)

    rows: list[dict[str, Any]] = collection.search(
        data=[vector],
        param={"metric_type": 'L2', "params": {"nprobe": 32}},
        anns_field='image_vector',
        output_fields=['id', 'meta_id', 'company_id'],
        limit=10,
    )
    logger.debug(rows)
    logger.debug(type(rows))

到此这篇关于Python使用imagehash库生成ahash算法的示例代码的文章就介绍到这了,更多相关Python imagehash生成ahash内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python 密码学示例——理解哈希(Hash)算法

    Hash 是密码学安全性的基石,它引入了单向函数(one-way function)和指纹(fingerprint)的概念.即: 对于任意输入,都可以产生相同的.唯一的输出值 输出值中不包含输入值的任何线索 一.保密性(confidentiality)与完整性(integrity) 简单来说,信息的保密性确保除授权人员以外的任何人都无法读取该消息,信息的完整性则确保除授权人员以外的任何人都无法修改该消息. 很多时候一段加密的消息无法被他人读取和理解(保密性),并不意味着该密文不会在传播过程中被截

  • 利用Python如何生成hash值示例详解

    一.介绍 如果在Python中需要对用户输入的密码或者其他内容进行加密,首选的方法是生成hash值. 在Python中可以利用二个模块来进行: - crypt - hashlib 二.crypt (一)crypt的主要方法和常量 名称 描述 md5(-) 利用md5算法加密 sha1(-) 利用sha1算法加密 sha224(-) 利用sha224算法加密 sha256(-) 利用sha256算法加密 sha384(-) 利用sha384算法加密 sha512(-) 利用sha512算法加密 (

  • Python比较两个图片相似度的方法

    本文实例讲述了Python比较两个图片相似度的方法.分享给大家供大家参考.具体分析如下: 这段代码实用pil模块比较两个图片的相似度,根据实际实用,代码虽短但效果不错,还是非常靠谱的,前提是图片要大一些,太小的图片不好比较.附件提供完整测试代码和对比用的图片. 复制代码 代码如下: #!/usr/bin/python # Filename: histsimilar.py # -*- coding: utf-8 -*- import Image def make_regalur_image(img

  • 基于Python实现Hash算法

    目录 1 前言 2 一般hash算法 2.1 算法逻辑 2.2 代码实现 2.3 总结 3 一致性hash算法 3.1 算法逻辑 3.2 代码实现 3.3 总结 1 前言 Simhash的算法简单的来说就是,从海量文本中快速搜索和已知simhash相差小于k位的simhash集合,这里每个文本都可以用一个simhash值来代表,一个simhash有64bit,相似的文本,64bit也相似,论文中k的经验值为3.该方法的缺点如优点一样明显,主要有两点,对于短文本,k值很敏感:另一个是由于算法是以空

  • python 比较2张图片的相似度的方法示例

    本文介绍了python 比较2张图片的相似度的方法示例,分享给大家,具体如下: #!/usr/bin/python # -*- coding: UTF-8 -*- import cv2 import numpy as np #均值哈希算法 def aHash(img): #缩放为8*8 img=cv2.resize(img,(8,8),interpolation=cv2.INTER_CUBIC) #转换为灰度图 gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

  • python实现识别相似图片小结

    文章简介 在网上看到python做图像识别的相关文章后,真心感觉python的功能实在太强大,因此将这些文章总结一下,建立一下自己的知识体系. 当然了,图像识别这个话题作为计算机科学的一个分支,不可能就在本文简单几句就说清,所以本文只作基本算法的科普向. 如有错误,请多包涵和多多指教. 参考的文章和图片来源会在底部一一列出. 以及本篇文章所用的代码都会在底下给出github地址. 安装相关库 python用作图像处理的相关库主要有openCV(C++编写,提供了python语言的接口),PIL,

  • Python使用imagehash库生成ahash算法的示例代码

    目录 知识点补充 前言 生成 ahash 向量数据库 创建集合 插入 ahash 到 milvus 查询 ahash from milvus 知识点补充 aHash算法 Hash算法进行图片相似度识别的本质,就是将图片进行Hash转化,生成一组二进制数字,然后通过比较不同图片的Hash值距离找出相似图片.aHash中文叫平均哈希算法,顾名思义,在进行转化过程中将用到像素均值. 基本原理: 1.缩小尺寸.这样做会去除图片的细节,只保留结构.明暗等基本信息,目的是统一图片大小,保证后续图片都有相同长

  • Python将QQ聊天记录生成词云的示例代码

    在这个情人节前夕,我把现任对象回收掉了,这段感情积攒了太多的失望,也给了我太多的伤害,所以我看到这个活动的第一反应是拒绝的.然而人生嘛,最重要的就是体验,沉浸在过去的回忆里没有意义,积极面对才能让自己更好地重振旗鼓. 所以,当大家都一致地在这个活动里各种秀恩爱时,我决定走一条不一样的路来为单身狗和刚分手的小伙伴们打打气:时间能改变的,是那些原本就不坚定的东西,未来的路还很长,笑一笑,一切都会过去的! 言归正传,我们要做的任务是,把 QQ 分手聊天记录导出,使用 Python 分词后做成分开的桃心

  • Python用UUID库生成唯一ID的方法示例

    UUID介绍 UUID是128位的全局唯一标识符,通常由32字节的字符串表示.它可以保证时间和空间的唯一性,也称为GUID,全称为:UUID -- Universally Unique IDentifier,Python 中叫 UUID. 它通过MAC地址.时间戳.命名空间.随机数.伪随机数来保证生成ID的唯一性. UUID主要有五个算法,也就是五种方法来实现. uuid1()--基于时间戳.由MAC地址.当前时间戳.随机数生成.可以保证全球范围内的唯一性,但MAC的使用同时带来安全性问题,局域

  • Python使用cx_Freeze库生成msi格式安装文件的方法

    本文实例讲述了Python使用cx_Freeze库生成msi格式安装文件的方法.分享给大家供大家参考,具体如下: ①.需要在目录下面创建一个文件 .setup.py ②.写入代码: import sys from cx_Freeze import setup, Executable import os os.environ['TCL_LIBRARY'] = r'C:\Python36-32\tcl\tcl8.6' os.environ['TK_LIBRARY'] = r'C:\Python36-

  • Python使用uuid库生成唯一标识ID

    uuid是128位的全局唯一标识符(univeral unique identifier),通常用32位的一个字符串的形式来表现.有时也称guid(global unique identifier).python中自带了uuid模块来进行uuid的生成和管理工作. python中的uuid模块基于信息如MAC地址.时间戳.命名空间.随机数.伪随机数来uuid.具体方法有如下几个: uuid.uuid1() 基于MAC地址,时间戳,随机数来生成唯一的uuid,可以保证全球范围内的唯一性. uuid

  • Python基于sklearn库的分类算法简单应用示例

    本文实例讲述了Python基于sklearn库的分类算法简单应用.分享给大家供大家参考,具体如下: scikit-learn已经包含在Anaconda中.也可以在官方下载源码包进行安装.本文代码里封装了如下机器学习算法,我们修改数据加载函数,即可一键测试: # coding=gbk ''' Created on 2016年6月4日 @author: bryan ''' import time from sklearn import metrics import pickle as pickle

  • python 用 xlwings 库 生成图表的操作方法

    xlwings是一个获得BSD许可的Python库,可以很容易地从Excel调用Python,反之亦然. 它适用于Windows和Mac上的Microsoft Excel. 在官方文档里找不到具体怎么生成图表,和一些参数设置. 这里自己整理了一下. import xlwings as xw app = xw.App() wb = app.books.active sht = wb.sheets.active chart = sht.charts.add(100, 10) # 100, 10 为图

  • Python和Matlab实现蝙蝠算法的示例代码

    目录 1前言 2 蝙蝠算法原理细讲 3 详细步骤 4Python实现 4.1代码 4.2结果 5Matlab实现 5.1 代码 5.2 结果 5.3 展望 1 前言 蝙蝠算法是2010年杨教授基于群体智能提出的启发式搜索算法,是一种搜索全局最优解的有效方法.该算法基于迭代优化,初始化为一组随机解,然后迭代搜寻最优解,且在最优解周围通过随机飞行产生局部新解,加强局部搜索速度.该算法具有实现简单.参数少等特点. 该算法主要用于目标函数寻优,基于蝙蝠种群利用产生的声波搜索猎物和控制飞行方向的特征来实现

  • Python实现异常检测LOF算法的示例代码

    目录 背景 LOF算法 1.k邻近距离 2.k距离领域 3.可达距离 4.局部可达密度 5.局部异常因子 LOF算法流程 LOF优缺点 Python实现LOF PyOD Sklearn 大家好,我是东哥. 本篇和大家介绍一个经典的异常检测算法:局部离群因子(Local Outlier Factor),简称LOF算法. 背景 Local Outlier Factor(LOF)是基于密度的经典算法(Breuning et. al. 2000), 文章发表于 SIGMOD 2000, 到目前已经有 3

  • Python&Matlab实现灰狼优化算法的示例代码

    目录 1 灰狼优化算法基本思想 2 灰狼捕食猎物过程 2.1 社会等级分层 2.2 包围猎物 2.3 狩猎 2.4 攻击猎物 2.5 寻找猎物 3 实现步骤及程序框图 3.1 步骤 3.2 程序框图 4 Python代码实现 5 Matlab实现 1 灰狼优化算法基本思想 灰狼优化算法是一种群智能优化算法,它的独特之处在于一小部分拥有绝对话语权的灰狼带领一群灰狼向猎物前进.在了解灰狼优化算法的特点之前,我们有必要了解灰狼群中的等级制度. 灰狼群一般分为4个等级:处于第一等级的灰狼用α表示,处于第

随机推荐