python计算图像感知相似度(PHash Sim)实例_图像相似度计算_图像质量评价

scient

scient一个用python实现科学计算相关算法的包,包括自然语言、图像、神经网络、优化算法、机器学习、图计算等模块。

scient源码和编译安装包可以在Python package index获取。

The source code and binary installers for the latest released version are available at the [Python package index].

https://pypi.org/project/scient

可以用pip安装scient

You can install scient like this:

pip install scient

也可以用setup.py安装。

Or in the scient directory, execute:

python setup.py install

scient.image

图像相关算法模块,包括边缘检测、图像相似度计算、图像质量评价、图像特征提取等。

scient.image.hash

图像hash模块,包括均值hash(mean hash),差值hash(diff hash),感知hash(percept hash)。

scient.image.hash.percept(image,hash_size=64)

Parameters

image : numpy.array 2D

hash_size : 输出hash值的长度

Returns

list

Algorithms

先将图片缩放成hash_size * hash_size大小,然后对图像进行离散余弦变换DCT,并输出左上角h * w=hash_size的mean hash。
DCT是一种特殊的傅立叶变换,将图片从像素域变换为频率域,并且DCT矩阵从左上角到右下角代表越来越高频率的系数,图片的主要信息保留左上角的低频区域。

一维DCT变换:

F ( x ) = c ( x ) ∑ i = 0 N − 1 f ( i ) c o s ( ( i + 0.5 ) π N x ) c ( x ) = { 1 N , x = 0 2 N , x ! = 0 F(x)=c(x)\sum^{N-1}_{i=0}{f(i)cos(\frac {(i+0.5)π}{N}x) } \\ c(x)=\left\{\begin{matrix}\sqrt{\frac{1}{N}} ,x=0\\\sqrt{\frac{2}{N}} ,x!=0 \end{matrix}\right. F(x)=c(x)i=0N1f(i)cos(N(i+0.5)πx)c(x)=

### 使用感知哈希算法计算图像相似度 感知哈希(Perceptual Hash, pHash)是一种用于比较两幅图像视觉上相似程度的技术。pHash 的核心在于将图片转换成一个紧凑的指纹字符串,使得即使原始文件不同,只要视觉效果相近,则其对应的哈希值也应尽可能接近。 #### 感知哈希的工作原理 1. **缩放处理** 图像被缩小到固定尺寸,通常是一个非常低分辨率版本,比如 32x32 像素。这一步骤有助于减少细节差异带来的影响[^1]。 2. **灰度化** 将彩色图转为黑白灰度图,进一步简化数据结构并去除颜色变化的影响。 3. **离散余弦变换 (DCT)** 对于每张经过预处理后的图像执行 DCT 变换,提取出频率域特征向量作为后续分析的基础。 4. **量化与二值化** 把得到的结果按照一定规则映射至更短长度位串形式表示;具体做法可以是对前几个最低频分量取整数部分后相加求平均再做阈值判断形成最终hash码流。 5. **汉明距离衡量** 当两张待测照片都完成了上述流程获得各自唯一的 hash 后,可通过简单对比两者间有多少位相同来评估它们之间差距大小——即所谓的“汉明距”。越小说明匹配度越高。 ```python import cv2 import numpy as np def dhash(image_path): """Compute difference hash.""" img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE) # Resize to fixed size resized_img = cv2.resize(img, (9, 8)) # Compute differences between adjacent pixels horizontally diff = resized_img[:, :-1] > resized_img[:, 1:] # Convert boolean array into binary string then hexademical representation bitstring = ''.join(['1' if v else '0' for row in diff for v in row]) hexadecimal = '{:0>{width}x}'.format(int(bitstring, base=2), width=len(diff.ravel())//4) return hexadecimal def hamming_distance(hash1, hash2): """Calculate Hamming distance between two hashes""" n = len(hash1) dist = sum(ch1 != ch2 for ch1, ch2 in zip(hash1, hash2)) return round(dist / float(n)*100) image_hash_1 = dhash('path_to_image1') image_hash_2 = dhash('path_to_image2') similarity_percentage = 100 - hamming_distance(image_hash_1, image_hash_2) print(f'Similarity percentage: {similarity_percentage}%') ``` 此代码片段展示了如何利用差分哈希方法实现简单的图像相似性检测功能,并通过汉明距离得出两个输入样本间的近似百分比率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值