Python使用imagehash庫(kù)生成ahash算法的示例代碼
知識(shí)點(diǎn)補(bǔ)充
aHash算法
Hash算法進(jìn)行圖片相似度識(shí)別的本質(zhì),就是將圖片進(jìn)行Hash轉(zhuǎn)化,生成一組二進(jìn)制數(shù)字,然后通過(guò)比較不同圖片的Hash值距離找出相似圖片。aHash中文叫平均哈希算法,顧名思義,在進(jìn)行轉(zhuǎn)化過(guò)程中將用到像素均值。
基本原理:
1、縮小尺寸。這樣做會(huì)去除圖片的細(xì)節(jié),只保留結(jié)構(gòu)、明暗等基本信息,目的是統(tǒng)一圖片大小,保證后續(xù)圖片都有相同長(zhǎng)度的哈希值,方便距離計(jì)算。網(wǎng)上看到的案例基本都將尺寸縮小為8*8,64個(gè)像素點(diǎn),暫時(shí)不清楚縮小為這個(gè)尺寸的原因,但如果覺(jué)得損失的信息太多,個(gè)人認(rèn)為可以將尺寸適當(dāng)調(diào)大,當(dāng)然像素點(diǎn)多了后續(xù)計(jì)算就會(huì)稍慢一些。
2、灰度化處理。將圖片全部轉(zhuǎn)換為統(tǒng)一的灰度圖。
3、計(jì)算像素均值。計(jì)算像素的灰度平均值(此處均值出現(xiàn))。
4、哈希值計(jì)算。將每個(gè)像素的灰度,與平均值進(jìn)行比較。大于或等于平均值,記為1,小于平均值,記為0,由此生成二進(jìn)制數(shù)組。
5、圖片配對(duì),計(jì)算漢明距離。距離越近,越相似。當(dāng)圖片縮小為8*8時(shí),通常認(rèn)為漢明距離小于10的一組圖片為相似圖片。
前言
有一個(gè)需求:計(jì)算圖片的相似度
需要解決兩個(gè)問(wèn)題:
- 生成 ahash
- 存儲(chǔ)和計(jì)算 ahash 之間的距離
生成 ahash
『生成 ahash』 選用 python 下面的一個(gè) imagehash 庫(kù)。(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 函數(shù)輸出的類(lèi)型是 bytes,就是二進(jìn)制序列
imagehash.average_hash(image) 輸出的 hash 對(duì)象,hash 對(duì)象有一個(gè) hash 屬性,這個(gè)屬性的類(lèi)型是 list[list[bool]]
打印出來(lái)就是長(zhǎng)下面這樣子,其實(shí)就是一個(gè) 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]]
向量數(shù)據(jù)庫(kù)
『存儲(chǔ)和計(jì)算 ahash 之間的距離』選用 milvus
創(chuàng)建集合
定義集合:
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) ]) # 集合不存在,則會(huì)自動(dòng)創(chuàng)建集合;已存在,不會(huì)重復(fù)創(chuàng)建 collection = Collection(settings.MILVUS_CONFIG.collection.name, schema)
使用的向量類(lèi)型是 dtype=DataType.BINARY_VECTOR
,
為什么不選 float 是因?yàn)槲也恢涝趺窗?ahash 轉(zhuǎn)成 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): """ 批量調(diào)用后端接口入庫(kù) 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))
到此這篇關(guān)于Python使用imagehash庫(kù)生成ahash算法的示例代碼的文章就介紹到這了,更多相關(guān)Python imagehash生成ahash內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
AI人工智能 Python實(shí)現(xiàn)人機(jī)對(duì)話
這篇文章主要為大家詳細(xì)介紹了AI人工智能應(yīng)用,本文擬使用Python開(kāi)發(fā)語(yǔ)言實(shí)現(xiàn)類(lèi)似于WIndows平臺(tái)的“小娜”,,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11pycharm 如何跳出服務(wù)器證書(shū)不受信任的提示
這篇文章主要介紹了pycharm 跳出服務(wù)器證書(shū)不受信任的提示操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03解析python調(diào)用函數(shù)加括號(hào)和不加括號(hào)的區(qū)別
這篇文章主要介紹了python調(diào)用函數(shù)加括號(hào)和不加括號(hào)的區(qū)別,不帶括號(hào)時(shí),調(diào)用的是這個(gè)函數(shù)本身 ,是整個(gè)函數(shù)體,是一個(gè)函數(shù)對(duì)象,不須等該函數(shù)執(zhí)行完成,具體實(shí)例代碼跟隨小編一起看看吧2021-10-10Python深度學(xué)習(xí)之實(shí)現(xiàn)卷積神經(jīng)網(wǎng)絡(luò)
今天帶大家學(xué)習(xí)如何使用Python實(shí)現(xiàn)卷積神經(jīng)網(wǎng)絡(luò),這是個(gè)很難的知識(shí)點(diǎn),文中有非常詳細(xì)的介紹,對(duì)小伙伴們很有幫助,需要的朋友可以參考下2021-06-06python數(shù)據(jù)預(yù)處理方式 :數(shù)據(jù)降維
今天小編就為大家分享一篇python數(shù)據(jù)預(yù)處理方式 :數(shù)據(jù)降維,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02python項(xiàng)目127.0.0.1:5000訪問(wèn)失敗問(wèn)題解決
Windows環(huán)境下啟動(dòng)python項(xiàng)目,接口訪問(wèn)失敗,本文給大家分享python項(xiàng)目127.0.0.1:5000訪問(wèn)失敗問(wèn)題解決方法,感興趣的朋友跟隨小編一起看看吧2023-09-09Python中2種常用數(shù)據(jù)可視化庫(kù)Bokeh和Altair使用示例詳解
本文對(duì)Python中兩個(gè)常用的數(shù)據(jù)可視化庫(kù)?Bokeh?和?Altair?進(jìn)行了比較和探討,通過(guò)對(duì)它們的特點(diǎn)、優(yōu)缺點(diǎn)以及使用示例的詳細(xì)分析,讀者可以更好地了解這兩個(gè)庫(kù)的功能和適用場(chǎng)景,從而更好地選擇合適的庫(kù)來(lái)進(jìn)行數(shù)據(jù)可視化工作,感興趣的朋友跟隨小編一起看看吧2024-04-04