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