图像哈希:全局+局部提取特征

文章信息
  1. 作者:梁小平,唐振军
  2. 期刊:ACM Trans. Multimedia Comput. Commun. Appl(三区)
  3. 题目:Robust Hashing via Global and Local Invariant Features for Image Copy Detection
目的、实验步骤及结论
  1. 目的:通过全局和局部提取特征来生成最终图像的哈希值。

  2. 实验步骤:
    在这里插入图片描述

    • 数据预处理:双线性插值(512 * 512)
    • 全局特征:
      • PDFT生成显著图S
      • 对GLCM使用四种参数(不同的角度)得到四个矩阵,每个矩阵得到4个统计特征,得到 1 * 16 的全局特征向量
    • 局部特征:
      • 使用HSV中的V分量,分块(64 * 64),将每一个块拼接成一个列向量,使用KPCA后得到d * N的矩阵。
      • 计算每一个矩阵维度的均值作为参考向量,计算所有向量(每一列)和参考向量的距离作为局部特征
    • 生成哈希值:将全局特征和局部特征进行拼接,使用量度排序作为最后的哈希值(长度为N+16)。
    • 相似性评价:使用汉明距离判断两张图片是否一致,若小于阈值则是相同图片。
  3. 结论

    • 首次提出KPCA应用于图像哈希
    • 适用于混合攻击
    • 全局特征对几何攻击(尤其是缩放和旋转)很敏感,而局部特征无法保持全局上下文信息导致判别效果不佳。
    • 使用全局和局部结合特征可以更加有利于互补进行提取特征。

本篇论文的实现代码如下:

def image_hash(img_path):img = processing(img_path)global_feature = global_feature_gen(img)local_feature = local_feature_gen(img, 10000, 4)h_i = gen_hashing(global_feature, local_feature)return h_idef processing(img_path):"""input:图片的路径output:处理后的RGB图片"""try:img = cv2.imread(img_path)x = img.shape[0]//2 # 高度y = img.shape[1]//2 # 宽度Min = x if x<y else ycropped_image = img[x-Min:x+Min, y-Min:y+Min] # 裁剪图像img = cv2.resize((cropped_image), (512,512), interpolation=cv2.INTER_LINEAR)except:img = imageio.mimread(img_path)img = np.array(img)img = img[0]img = img[:, :, 0:3]x = img.shape[0]//2 # 高度y = img.shape[1]//2 # 宽度Min = x if x<y else ycropped_image = img[x-Min:x+Min, y-Min:y+Min, :] # 裁剪图像img = cv2.resize((cropped_image), (512,512), interpolation=cv2.INTER_LINEAR)
#     out = cv2.GaussianBlur(img, (3, 3),1.3) # 使用python自带的高斯滤波kernel = np.array([[1,2,1],[2,4,2],[1,2,1]])/16out = cv2.filter2D(img, -1 , kernel=kernel)  # 二维滤波器# out = cv2.cvtColor(out, cv2.COLOR_BGR2RGB)out = cv2.cvtColor(out, cv2.COLOR_BGR2HSV)return outdef local_feature_gen(img, sigma, n_components):"""iamge:(512,512,3)return: 降维之后的图像(d, N)"""from sklearn.decomposition import PCA, KernelPCAN_list = []V = img[:,:,2]for i in range(0,V.shape[0],64):for j in range(0,V.shape[1],64):image_block = V[i:i+64, j:j+64]N_list.append(image_block.reshape(-1)[:])N_list = np.array(N_list).copy()# kernel_pca = KernelPCA(n_components=4, kernel="poly", gamma=10)# result = kernel_pca.fit_transform(N_list)result = kpca(N_list, sigma, 4).copy()return result.Tdef gaussian_kernel(X, sigma):sq_dists = pdist(X, 'sqeuclidean')  # 计算所有样本点之间的平方欧式距离mat_sq_dists = squareform(sq_dists)  # 转换成矩阵形式return np.exp(-mat_sq_dists / (2 * sigma**2))  # 计算高斯核矩阵def kpca(X, sigma, n_components):# 步骤1: 计算高斯核矩阵K = gaussian_kernel(X, sigma)# 步骤2: 中心化核矩阵N = K.shape[0]one_n = np.ones((N, N)) / NK = K - one_n.dot(K) - K.dot(one_n) + one_n.dot(K).dot(one_n)# 步骤3: 计算特征值和特征向量eigenvalues, eigenvectors = eigh(K)eigenvalues, eigenvectors = eigenvalues[::-1], eigenvectors[:, ::-1]  # 降序排列# 步骤4: 提取前n个特征向量alphas = eigenvectors[:, :n_components]lambdas = eigenvalues[:n_components]return alphas / np.sqrt(lambdas)  # 归一化特征向量def global_feature_gen(img):P = pqft(img)return P
def pqft(img, sigma=8):h, w, channel = img.shaper, b, g = img[:,:,0], img[:,:,1], img[:,:,2]R = r - (g + b)/2G = g - (r + b)/2B = b - (r + g)/2Y = (r + g)/2 - (abs(r - g))/2 - bRG = R - GBY =B - YI1 = ((r+g+b) /3)M = np.zeros((h, w))f1 = M + RG * 1jf2 = BY + I1 * 1jF1 = np.fft.fft2(f1)F2 = np.fft.fft2(f2)phaseQ1 = np.angle(F1)phaseQ2 = np.angle(F2)ifftq1 = np.fft.ifft2(np.exp(phaseQ1 * 1j))ifftq2 = np.fft.ifft2(np.exp(phaseQ2 * 1j))absq1 = np.abs(ifftq1)absq2 = np.abs(ifftq2)squareq=(absq1+absq2) * (absq1+absq2)out = cv2.GaussianBlur(squareq, (5, 5), sigma)out = cv2.normalize(out.astype('float'), None, 0, 255, cv2.NORM_MINMAX)return outdef gen_hashing(global_feature, local_feature):"""先求出列均值,在算出每一列之间的距离,最后使用序数度量来代表哈希值input:array (x,64,64)output:list (x)"""result = glcm(global_feature)y_mean = np.mean(local_feature, axis = 0)z = np.sqrt((y_mean[1:] - y_mean[:-1]) ** 2) * 1000result.extend(z)sorted_indices = sorted(range(len(result)), key=lambda i: result[i])result = [sorted_indices.index(i)+1 for i in range(len(result))]return resultdef glcm(img, levels = 32):'''https://www.cnblogs.com/xiaoliang-333/articles/16937977.htmlgraycom = greycomatrix(img, [1], [0, np.pi/4, np.pi/2, np.pi*3/4], levels=256)c = feature.greycoprops(graycom, 'contrast')  # 对比度d = feature.greycoprops(graycom, 'dissimilarity')   # 相异性h = feature.greycoprops(graycom, 'homogeneity')    # 同质性e = feature.greycoprops(graycom, 'energy')    # 能量corr = feature.greycoprops(graycom, 'correlation')    # 相关性ASM = feature.greycoprops(graycom, 'ASM')     # 角二阶矩'''from skimage.feature import graycomatrix, graycopropsimg = img.astype(np.float64)img = img * levels / 256.0img = img.astype(np.uint8)distances = [1, 1, 1, 1]  angles = [0, 45, 90, 135] #初始化一个空列表来存储GLCM矩阵统计特征glcms = []#为每个距离和角度组合计算 GLCMfor d,a in zip(distances,angles):glcm = graycomatrix(img,distances=[d],angles=[a],levels=levels,symmetric=True, normed=True)contrast = graycoprops(glcm, 'ASM')     glcms.append(contrast[0, 0])correlation = graycoprops(glcm, 'contrast')  glcms.append(correlation[0, 0])energy = graycoprops(glcm, 'correlation')    glcms.append(energy[0, 0])homogeneity = graycoprops(glcm, 'homogeneity')    glcms.append(homogeneity[0, 0])# return np.array(np.round(glcms), dtype=np.uint8)return glcmsdef dist_img(h1,h2):# distance = np.count_nonzero(np.array(list(h1)) != np.array(list(h2)))# return distance / len(h1)h1 = np.array(h1)h2 = np.array(h2)return sum(np.abs(h1-h2))/len(h1)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/644351.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python实现钉钉通讯录导出Excel表

Python工具开源专栏 Py0004 python实现钉钉通讯录导出Excel表 Python工具开源专栏前言目录结构部分演示完整代码已在GitHub上开源 前言 需求来源于公司&#xff0c;需要将钉钉通讯录以Excel表的形式导出到本地&#xff0c;方便定期备份。导出的Excel需要处理钉钉用户兼任多部门…

【Kafka】安装配置操作(二)

Kafka安装与操作 安装与配置 版本说明 安装包下载地址&#xff1a; http://archive.apache.org/dist/kafka/3.5.0/ 源码包下载地址&#xff1a; http://archive.apache.org/dist/kafka/3.5.0/ 安装配置 1)解压&#xff1a; tar -zxvf kafka_2.12-3.5.0.tgz -C /opt/module/ 2…

贪心算法-活动安排问题和背包问题

实验6贪心算法-活动安排问题和背包问题 实验目的&#xff1a; 理解贪心算法的基本思想运用贪心算法解决实际问题 实验内容&#xff1a; 采用贪心方法编程实现以下问题的算法 1.如何安排下列活动使得使用的活动场所最少&#xff0c;并给出具体的安排方法。 活动 a b c …

【笔试】03

FLOPS FLOPS 是 Floating Point Operations Per Second 的缩写&#xff0c;意为每秒浮点运算次数。它是衡量计算机性能的指标&#xff0c;特别是用于衡量计算机每秒能够执行多少浮点运算。在高性能计算领域&#xff0c;FLOPS 被广泛用来评估超级计算机、CPU、GPU 和其他处理器…

甘特图是什么?利用甘特图来优化项目管理流程

在现代项目管理中,图表是一种强大而直观的工具,可以帮助项目经理和团队成员清晰地了解并掌控整个项目进程。其中,甘特图是最常用和最有效的图表之一。 甘特图是一种条形图,可以用来直观地展示项目中各个任务的进度、持续时间和相互关系。它由一个横轴和一个纵轴组成。横轴代表时…

2024 OceanBase 开发者大会:OceanBase 4.3正式发布,打造PB级实时分析数据库

4月20日&#xff0c;2024 OceanBase开发者大会盛大召开&#xff0c;吸引了50余位业界知名的数据库专家和爱好者&#xff0c;以及来自全国各地的近600名开发者齐聚一堂。他们围绕一体化、多模、TP与AP融合等前沿技术趋势展开深入讨论&#xff0c;分享场景探索的经验和最佳实践&a…

编程基础“四大件”

基础四大件包括&#xff1a;数据结构和算法,计算机网络,操作系统,设计模式 这跟学什么编程语言,后续从事什么编程方向均无关&#xff0c;只要做编程开发&#xff0c;这四个计算机基础就无法避开。可以这么说&#xff0c;这基础四大件真的比编程语言重要&#xff01;&#xff0…

typedef 定义函数指针

typdef int(*FUNC_TYPE)(int,int) FUNC_TYPE p NULL; 定义了一个函数指针 函数指针作为函数的参数的用法demon

基于python+django+mysql农业生产可视化系统

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Php和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…

I2C,UART,SPI(STM32、51单片机)

目录 基本理论知识&#xff1a; 并行通信/串行通信&#xff1a; 异步通信/同步通信&#xff1a; 半双工通信/全双工通信: UART串口&#xff1a; I2C串口&#xff1a; SPI串口&#xff1a; I2C在单片机中的应用&#xff1a; 软件模拟&#xff1a; 51单片机&#xff1a;…

投票刷礼物链接怎么弄?最新投票活动创建系统源码 轻松创建活动

投票刷礼物链接怎么弄&#xff1f;投票活动创建系统的作用和功能多种多样&#xff0c;为用户提供一个便捷、高效且功能强大的平台&#xff0c;用于创建、管理和执行各种投票活动。分享一个最新投票活动创建系统源码&#xff0c;源码开源可二开&#xff0c;含完整代码包和详细搭…

对象与JSON字符串互转

1、JSON字符串转化成JSON对象 JSONObject jsonobject JSON.parseObject(str); 或者 JSONObject jsonobject JSONObject.parseObject(str); 功能上是一样的&#xff0c;都是将JSON字符串&#xff08;str&#xff09;转换成JSON对象 jsonobject 。注意str一定得是以键值对存在…