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

文章信息
  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://xiahunao.cn/news/2980519.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

STM32的端口引脚的复用功能及重映射功能解析

目录 STM32的端口引脚的复用功能及重映射功能解析 复用功能 复用功能的初始化 重映射功能 重映射功能的初始化 复用功能和重映射的区别 部分重映射与完全重映射 补充 STM32的端口引脚的复用功能及重映射功能解析 复用功能 首先、我们可以这样去理解stm32引脚的复用功能…

SpringBoot学习之Kafka发送消费消息入门实例(三十五)

使用Kafka之前需要先启动fKafka,如何下载安装启动kafka请先参考本篇文章的前两篇: 《SpringBoot学习之Kafka下载安装和启动【Windows版本】(三十四)》 《SpringBoot学习之Kafka下载安装和启动【Mac版本】(三十三)》 一、POM依赖 1、加入kafka依赖 2、我的整个POM代码…

Adobe Photoshop CC 2017无法打开解决方案

Adobe Photoshop CC 2017双击无反应&#xff0c;右键以管理员身份运行也没有反应 解决方案&#xff1a; 事件查看器中查看应用程序的事件 如果找到程序报错事件&#xff0c;网上下载ZXPSignLib-minimal.dll文件替换错误模块路径位置的该文件即可 ZXPSignLib-minimal.dll下载地…

SpringBoot+Vue开发记录(三)

说明&#xff1a;本篇文章的主要内容为需求分析。需求分析这一部分很重要&#xff0c;也稍微有点子难搞&#xff0c;所以本篇文章里的有些内容会有失偏颇。 一、准备步骤 我打算做一个刷题项目&#xff0c;但是具体这个项目该怎么做&#xff0c;我是一头雾水。 所以就要先进行…

pytorch-trainvaltest划分

目录 1. 上一节回顾2. 数据集划分3. 完整代码 1. 上一节回顾 下列图中三种曲线分别代表了欠拟合、好的拟合和过拟合 下图为过拟合曲线&#xff0c;那么如何来检测过拟合呢&#xff1f;将数据集划分为train和val&#xff08;validation&#xff09;val是用来测试训练过程是否过…

CSS 04

去掉 li 前面的 项目符号(小圆点) 语法 list-style: none;圆角边框 border-radius 属性用于设置元素的外边框圆角。 语法 border-radius:length;参数值可以为数值或百分比的形式如果是正方形&#xff0c;想要设置为一个圆&#xff0c;把数值修改为高度或者宽度的一半即可&a…

Opencv_11_通道的分离与合并

void ColorInvert::channels_demo(Mat& image) { std::vector<Mat> mv; split(image, mv); imshow("蓝色", mv[0]); imshow("绿色", mv[1]); imshow("红色", mv[2]); Mat dst; mv[0] 0; merge(mv, dst);…

【Camera KMD ISP SubSystem笔记】CRM V4L2驱动模型

1. CRM为主设备 /dev/video0&#xff0c;先创建 v4l2_device 设备&#xff0c;再创建 video_device 设备&#xff0c;最后创建 media_device 设备/dev/media0 v4l2_device的mdev指向media_device&#xff0c;v4l2_device的entity链接到media_device的entities上&#xff08…

WEB服务的配置与使用 Apache HTTPD

服务端&#xff1a;服务器将发送由状态代码和可选的响应正文组成的 响应 。状态代码指示请求是否成功&#xff0c;如果不成功&#xff0c;则指示存在哪种错误情况。这告诉客户端应该如何处理响应。较为流星的web服务器程序有&#xff1a; Apache HTTP Server 、 Nginx 客户端&a…

【debug记录】有gpu,但是 pytorch仍显示 cpu【原来是新电脑没安装cuda】

原来是新电脑没安装cuda&#xff0c;以为安装了pytorch包就可以了。 检查过程&#xff1a; nvcc 不是内部或外部命令&#xff0c;也不是可运行的程序, 说明没有安装cuda。 查看电脑显卡最高支持cuda版本&#xff1a;nvidia-smi 安装cuda&#xff0c;选择版本&#xff1a;ht…

Android Studio 报错:AVD Pixel_3a_API_30_x86 is already running

在我的Android Studio和虚拟机运行时&#xff0c;我的电脑不小心关机了&#xff0c;在启动后再次打开Android Studio并运行虚拟机时发现报错。 Error while waiting for device: AVD Pixel_3a_API_30_x86 is already running. If that is not the case, delete the files at C…

系统安全与应用(1)

目录 1、账号安全管理 &#xff08;1&#xff09;禁止程序用户登录 &#xff08;2&#xff09;锁定禁用长期不使用的用户 &#xff08;3&#xff09;删除无用的账号 &#xff08;4&#xff09;禁止账号和密码的修改 2、密码安全管理 设置密码有效期 1&#xff09;针对已…

《ElementPlus 与 ElementUI 差异集合》el-select 差异点,如:高、宽、body插入等

宽度 Element UI 父元素不限制宽度时&#xff0c;默认有个宽度 207px&#xff1b; 父元素有固定宽度时&#xff0c;以父元素宽度为准&#xff1b; Element Plus 父元素不限制宽度时&#xff0c;默认100%&#xff1b; 父元素有固定宽度时&#xff0c;以父元素宽度为准&#x…

【模电】常见经典运放电路(持续更新)

反相 反相输入比例电路 仿真文件 链接&#xff1a;https://pan.baidu.com/s/1nft1B3mgNpoPfgWo6pFE1g?pwdfpd2 提取码&#xff1a;fpd2 同相 同相输入比例电路 仿真文件 链接&#xff1a;https://pan.baidu.com/s/151OzVgJ2M1iLJ9GCH3xp_A?pwdelec 提取码&#xff1a;…

ROS1快速入门学习笔记 - 04创建工作环境与功能包

一、定义 工作空间(workspace)是一个存放工程开发相关文件的文件夹。 src:代码空间&#xff08;Source Space&#xff09;build: 编辑空间&#xff08;Build Space&#xff09;devel:开发空间&#xff08;Development Space&#xff09;install:安装空间&#xff08;Install …

OpenHarmony实战开发-页面布局检查器ArkUI Inspector使用指导

DevEco Studio内置ArkUI Inspector工具&#xff0c;开发者可以使用ArkUI Inspector&#xff0c;在DevEco Studio上查看应用在真机上的UI显示效果。利用ArkUI Inspector工具&#xff0c;开发者可以快速定位布局问题或其他UI相关问题&#xff0c;同时也可以观察和了解不同组件之间…

TiDB 6.x 新特性解读 | Collation 规则

对数据库而言&#xff0c;合适的字符集和 collation 规则能够大大提升使用者运维和分析的效率。TiDB 从 v4.0 开始支持新 collation 规则&#xff0c;并于 TiDB 6.0 版本进行了更新。本文将深入解读 Collation 规则在 TiDB 6.0 中的变更和应用。 引 这里的“引”&#xff0c;…

【服务器部署篇】Linux下Ansible安装和配置

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0c;产…

碳课堂|什么是碳市场?如何进行碳交易?

近年来&#xff0c;随着全球变暖问题日益受到重视&#xff0c;碳达峰、碳中和成为国际社会共识&#xff0c;为更好地减缓和适应气候变化&#xff0c;同时降低碳关税风险&#xff0c;以“二氧化碳的排放权利”为商品的碳交易和碳市场应时而生。 一、什么是碳交易、碳市场 各国…

python爬虫 - 爬取html中的script数据(36kr.com新闻信息)

文章目录 1. 分析页面内容数据格式2. 使用re.findall方法&#xff0c;爬取新闻3. 使用re.search 方法&#xff0c;爬取新闻 1. 分析页面内容数据格式 打开 https://36kr.com/ 按F12&#xff08;或 在网页上右键 --> 检查&#xff08;Inspect&#xff09;&#xff09; 找…