图像哈希:DCT篇

Robust image hashing with dominant DCT coefficients
文章信息
  1. 作者:唐振军
  2. 期刊:Optic(Q2/3区)
  3. 题目:Robust image hashing with dominant DCT coefficients
目的、实验步骤及结论
  1. 目的:使用传统的DCT对图像进行压缩,由于压缩后的信息主要集中在左上角,因此使用左上角的数据进行比较生成图像的哈希值。

  2. 实验步骤

    • 数据预处理:双线性插值(M*M大小),高斯低通滤波,转换到YCbCr空间(只使用Y分量)

    • 特征提取:分块(64*64);每一个块使用DCT,使用每一行和列的2-33个元素构造两个向量 P i 1 P_i^1 Pi1 Q i 1 Q_i^1 Qi1,其中列向量 Q i 1 Q_i^1 Qi1 使用伪随机重新生成新的向量 Q i 2 Q_i^2 Qi2;计算出 P i 1 P_i^1 Pi1 Q i 2 Q_i^2 Qi2 的L2距离 d i d_i di ,通过公式计算每一个块的哈希值(记得标准化)。
      h ( i ) = { 0 , d i < T 1 , O t h e r w i s e 其中 T 表示 d 排序结果的中间值 h(i) = \begin{cases} 0,d_i < T\\ 1,Otherwise \end{cases}\\ 其中T表示d排序结果的中间值 h(i)={0,di<T1,Otherwise其中T表示d排序结果的中间值

    • 图像相似度:使用每张图片之间的汉明距离来判断是否相似。小于阈值则相似,否则不相似。

  3. 结论:

    使用DCT后大部分数据集中在左上角;块之间进行标准化可以提升鲁棒性;使用相邻两个元素进行比较生成哈希值。

自我总结
  1. 两个值得模仿的图表
    • 绘制了200张不同图片的汉明距离直方图
    • 统计不同攻击的汉明距离(平均值,最小值,最大值,方差)
    • 统计不同阈值FPR和TPR

论文中实现的代码如下:

def image_hash(img_path):img = processing(img_path)C_r_list = image_feature(img)h_i = gen_hashing(C_r_list)return h_idef processing(img_path):"""input:图片的路径output:处理后的RGB图片"""img = cv2.imread(img_path)img = cv2.resize(img, (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_BGR2HLS)return outdef image_feature(img):"""iamge:(512,512,3)return: array格式(x,64,64)"""C_r_list = np.zeros((0,64,64)).tolist()for i in range(0,512,64):for j in range(0,512,64):image_block = img[i:i+64,j:j+64,:]C_r,C_i,C_j,C_k = QDCT(image_block) # 可以在这里取出实部和三个虚数的实部C_r_list.append(np.sqrt(C_r**2+C_i**2+C_j**2+C_k**2).tolist())return np.array(C_r_list)def gen_hashing(feature_matrix):"""生成图像哈希值,和原论文不同,我的P和Q矩阵是每一行代表一个图像块。input:array (x,64,64)output:list (x)"""d_i = []h_i = []P_matrix = np.zeros((0,32)).tolist()Q_matrix = np.zeros((0,32)).tolist()for i in feature_matrix:i = np.array(i)row = i[0,1:33].reshape(1,-1)column = i[1:33,0].reshape(1,-1)P_matrix.extend(row.tolist())Q_matrix.extend(column.tolist())P_matrix = np.array(P_matrix)Q_matrix = np.array(Q_matrix)P_matrix_1 = (P_matrix - np.mean(P_matrix,axis = 0))/np.std(P_matrix,axis = 0,ddof=1)Q_matrix_1 = (Q_matrix - np.mean(Q_matrix,axis = 0))/np.std(Q_matrix,axis = 0,ddof=1)d_i = np.sqrt(np.sum((P_matrix_1 - Q_matrix_1)**2,axis = 1))median = np.median(d_i)for i in d_i:if i < median:h_i.append(0)else:h_i.append(1)return np.array(h_i)def QDCT(img):"""img:(64,64,3)"""# C_r = DCT(img[:,:,0]+img[:,:,1]+img[:,:,2]) * (- 1 / np.sqrt(3))Y = cv2.cvtColor(img, cv2.COLOR_RGB2YUV)[:,:,0]V_blk = np.sum((Y-np.mean(Y))**2)/(img.shape[0]**2)C_r = cv2.dct(np.float32(img[:,:,0]+img[:,:,1]+img[:,:,2]) * (- 1 / np.sqrt(3)))C_i = cv2.dct(np.float32(img[:,:,2]-img[:,:,1]+V_blk) * (1 / np.sqrt(3)))C_j = cv2.dct(np.float32(img[:,:,0]-img[:,:,2]+V_blk) * (1 / np.sqrt(3)))C_k = cv2.dct(np.float32(img[:,:,1]-img[:,:,0]+V_blk) * (1 / np.sqrt(3)))# C_i = DCT(img[:,:,2]-img[:,:,1]) * (1 / np.sqrt(3))# C_j = DCT(img[:,:,0]-img[:,:,2]) * (1 / np.sqrt(3))# C_k = DCT(img[:,:,1]-img[:,:,0]) * (1 / np.sqrt(3))return C_r,C_i,C_j,C_k
def dist_img(h1,h2):return sum(np.abs(h1-h2))

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

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

相关文章

ChatGPT如何助力科研创新,提升研究效率?

随着人工智能技术的快速发展&#xff0c;其在科研领域的应用也愈发广泛。AI不仅提升了科研创新的效率&#xff0c;还为科研人员带来了前所未有的便利。本文将从ChatGPT深度科研应用、数据分析及机器学习、AI绘图以及高效论文撰写等方面&#xff0c;综述AI如何助力科研创新与效率…

python--使用pika库操作rabbitmq实现需求

Author: wencoo Blog&#xff1a;https://wencoo.blog.csdn.net/ Date: 22/04/2024 Email: jianwen056aliyun.com Wechat&#xff1a;wencoo824 QQ&#xff1a;1419440391 Details:文章目录 目录正文 或 背景pika链接mqpika指定消费数量pika自动消费实现pika获取队列任务数量pi…

JavaScript(二)

JavaScript的语法 1.JavaScript的大小写 在JavaScript中&#xff0c;大小写是敏感的&#xff0c;这意味着大小写不同的标识符被视为不同的变量或函数。例如&#xff0c;myVariable 和 myvariable 被视为两个不同的变量。因此&#xff0c;在编写JavaScript代码时&#xff0c;必…

如何在PostgreSQL中创建并使用窗口函数来进行复杂的分析查询?

文章目录 解决方案1. 了解窗口函数的基本概念2. 常用的窗口函数3. 使用示例示例 1&#xff1a;计算每行销售数据的累计销售额示例 2&#xff1a;计算每行销售数据相对于前一行销售额的增长率 结论 PostgreSQL 提供了一套强大的窗口函数&#xff08;Window Functions&#xff09…

第四十六节 Java 8 Stream

Java 8 API添加了一个新的抽象称为流Stream&#xff0c;可以让你以一种声明的方式处理数据。 Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。 Stream API可以极大提高Java程序员的生产力&#xff0c;让程序员写出高…

MQTT Broker 白皮书:全面实用的 MQTT Broker 选型指南

在智能数字化时代&#xff0c;家居设备、工厂传感器、智能汽车、能源电力计量表等各类设备都已变身为新型的智能终端。为了满足这些海量且持续增长的智能设备之间对于实时、可靠的消息传递的需求&#xff0c;MQTT Broker 消息代理或消息中间件扮演了至关重要的角色。作为新一代…

STM32H750外设ADC之模拟窗口看门狗

目录 概述 1 相关寄存器 2 功能描述 3 AWDx 标志和中断 4 模拟看门狗 1 4.1 模拟看门狗 1 说明 4.2 模拟看门狗通道选择 4.3 阀值选择 5 模拟看门狗 2和3 6 ADCx_AWDy_OUT 信号输出生成 6.1 功能介绍 6.2 输出信号案例 7 模拟看门狗 1、 2、 3 比较 概述 本文主…

GEE:直方图匹配

作者:CSDN @ _养乐多_ 本文将介绍如何在 Google Earth Engine (GEE) 平台中,进行直方图匹配的代码。本文以Sentinel2和Landsat9的影像为例,将Landsat9的影像的分布直方图转换到了Sentinel2中相同波段的直方图,并可视化了匹配前后效果。该方法也可以用于影像融合,将低分辨…

Opencv_3_图像对象的创建与赋值

ColorInvert.h 如下&#xff1a; #include <opencv.hpp> using namespace std; #include <opencv.hpp> using namespace cv; using namespace std; class ColorInvert{ public : void mat_creation(); }; ColorInvert.cpp 文件如下&#xff1a; #include &q…

从零手写 tomcat

从零手写例子 项目简介 /\_/\ ( o.o ) > ^ <mini-cat 是简易版本的 tomcat 实现。别称【嗅虎】(心有猛虎&#xff0c;轻嗅蔷薇。) 开源地址&#xff1a;https://github.com/houbb/minicat 特性 简单的启动实现/netty 支持 servlet 支持 静态网页支持 filter/list…

解决宝塔面板无法访问(无法访问或拒绝链接)

&#x1f40c;博主主页&#xff1a;&#x1f40c;​倔强的大蜗牛&#x1f40c;​ &#x1f4da;专栏分类&#xff1a;Linux ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 问题如下&#xff1a; 本人设置了授权IP&#xff0c;但是有些问题&#xff0c;所以是打算取消授权IP 重…

Spring Boot 自动装配执行流程

Spring Boot 自动装配执行流程 Spring Boot 自动装配执行流程如下&#xff1a; Spring Boot 启动时会创建一个 SpringApplication实例&#xff0c;该实例存储了应用相关信息&#xff0c;它负责启动并运行应用。实例化 SpringApplication 时&#xff0c;会自动装载META-INF/spr…

Linux文件chattr/lsattr/Linux权限(搭建权限测试环境实战)引申到内部原理及Linux删除系统文件原理-7539字详谈

企业高薪思维: 每一个阶段什么时候是最重要的&#xff1f;&#xff08;快速定位&#xff09; 1.学习最重要的事情 &#xff08;学生阶段&#xff0c;找工作前阶段&#xff09; 2.家庭&#xff0c;女朋友 &#xff08;工作阶段/学生阶段&#xff0c;学习不受到影响&#xff09; …

修改Ubuntu22.04系统图标

在Ubuntu 22.04中更改开机时显示的Ubuntu图标需要修改的设置。 主要思路是用自己图片替换系统图片&#xff0c;保持系统图片同名&#xff0c;同格式。 以下是一般的步骤&#xff1a; 修改启动界面的logo&#xff1a; sudo cp 新logo.png /usr/share/plymouth/themes/spinn…

k8s pod 绑核

一、概述 默认配置下&#xff0c;kubelet/Linux 使用 CFS&#xff08;完全公平调度&#xff09;算法来为 Pod 分配 CPU&#xff0c;工作负载&#xff08;Pod 中的进程&#xff09;会被调度到不同的可用的 CPU 核心&#xff0c;而且大多数工作负载对这种迁移带来的性能损失并不…

狠不狠?做个标签累不累?

QT是专门用来开发用户界面的程序&#xff0c;小部件&#xff08;Widgets&#xff09;是构成用户界面的基本元素。QT6提供了一个丰富的库&#xff0c;用于创建桌面、移动和嵌入式应用程序的用户界面。 小部件是图形用户界面(GUI)编程中的一个重要概念。它是构成用户界面的基本元…

@NameBinding注解名称绑定过滤器/拦截器

NameBinding注解名称绑定过滤器/拦截器&#xff0c;只针对某一些资源方法执行处理逻辑 一、为什么要用名称绑定 一般情况下&#xff0c;借助Spring的过滤器或者拦截器等对Http请求或响应进行处理就能满足需求。但是在有些场景下若只需对特定的xxxResource做拦截处理&#xff0…

项目大集成

一 keeplived 高可用 192.168.11.11nginx keeplived192.168.11.12nginx keeplived 两台均编译安装服务器 1 主服务器修改文件&#xff1a; 2 备服务器修改文本 scp keepalived.conf 192.168.11.12:/etc/keepalived/ 3 给主服务器添加虚拟ip ifconfig ens33:0 192.168…

Qt5怎么用QSetting生成配置文件、读取配置文件和保存配置文件

2024年4月22日&#xff0c;周一下午 在 Qt5 中&#xff0c;可以通过 QSettings 类生成、读取和保存配置文件。 QSettings 类提供了一个跨平台的接口&#xff0c;用于读取和写入应用程序的设置和配置信息&#xff0c;这些信息可以存储在不同的地方&#xff0c;如注册表&#xf…

【多态】底层原理

博主首页&#xff1a; 有趣的中国人 专栏首页&#xff1a; C进阶 本篇文章主要讲解 多态底层原理 的相关内容 1. 多态原理 1.1 虚函数表 先看一下这段代码&#xff0c;计算一下sizeof(Base)是多少&#xff1a; class Base { public:virtual void Func1(){cout << &quo…