图像哈希:QDFT篇

news2024/11/15 4:43:45
这个领域的背景
相关性质

QDFT和IQDFT的公式:
F ( u , v ) = 1 M ∑ x = 0 M − 1 ∑ y = 0 M − 1 e − 2 μ π ( u x M + v y M ) f ( x , y ) f ( x , y ) = 1 M ∑ u = 0 M − 1 ∑ v = 0 M − 1 e − 2 μ π ( u x M + v y M ) f ( u , v ) 注:如果是 D F T 的话将 μ 改为 i 即可 F(u,v)=\frac{1}{M}\sum_{x=0}^{M-1}\sum_{y=0}^{M-1}e^{-2\mu\pi(\frac{ux}{M}+\frac{vy}{M})}f(x,y)\\ f(x,y)=\frac{1}{M}\sum_{u=0}^{M-1}\sum_{v=0}^{M-1}e^{-2\mu\pi(\frac{ux}{M}+\frac{vy}{M})}f(u,v)\\ 注:如果是DFT的话将\mu改为i即可 F(u,v)=M1x=0M1y=0M1e2μπ(Mux+Mvy)f(x,y)f(x,y)=M1u=0M1v=0M1e2μπ(Mux+Mvy)f(u,v)注:如果是DFT的话将μ改为i即可

文章信息
  1. 作者:Junlin Ouyang
  2. 期刊:HAL
  3. 题目:Robust hashing for image authentication using quaternion discrete Fourier transform and log-polar transform
目的、实验步骤及结论
  1. 目的:使用对数极坐标来抗旋转,之后再用QDFT提取特征。

  2. 实验步骤

    • 数据预处理:先统一256*256的大小,再使用k * k的平均滤波器(窗口大小为7),最后将最大内切圆以外的像素置为0(黑色)。

    • 对数极坐标变换:对圆形的图像进行对数极坐标变换,形成二次图像。

    • QDFT:对二次图像进行QDFT,使用中心的p(15*15)个低频信号的系数,通过下述公式来生成哈希值,即比较前后两个低频信号的系数来生成哈希值。
      在这里插入图片描述

    • 相似性评价:使用汉明距离来判断两张图片是否一致,如果小于阈值则是一张图片。

  3. 结论:

    这篇论文提供了一个抗旋转的小组件,也就是对数极坐标,这个针对于特定的算法能够很有效地提高康旋转的能力,同时在这篇论文中使用公式进行推导:旋转之后的图片使用对数极坐标+QDFT后形成的哈希值理论上完全一致。

在进行代码实现的时候,由于论文中并没有给出QDFT后的四元数矩阵系数的计算公式,但是可以直接使用二维快速傅里叶变换实现计算。实现代码如下:

def image_hash(img_path,k):
    img = processing(img_path)
    feature = image_feature(img)
    h_i = gen_hashing(feature,k)
    return h_i

def 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 y
        cropped_image = img[x-Min:x+Min, y-Min:y+Min] # 裁剪图像
        img = cv2.resize((cropped_image), (256,256), 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 y
        cropped_image = img[x-Min:x+Min, y-Min:y+Min] # 裁剪图像
        img = cv2.resize((cropped_image), (256,256), interpolation=cv2.INTER_LINEAR)
#     out = cv2.GaussianBlur(img, (3, 3),1.3) # 使用python自带的高斯低通滤波
    kernel = np.ones((7,7), np.float32) / 49 # 平均滤波器
    out = cv2.filter2D(img, -1 , kernel=kernel)  # 二维滤波器
    out = cv2.cvtColor(out, cv2.COLOR_BGR2RGB)
    out = square2circle(out)
    log_polar_img = cv2.logPolar(out, (out.shape[1] // 2, out.shape[0] // 2), 50, cv2.WARP_FILL_OUTLIERS)
    return log_polar_img

def square2circle(img):
    """
    将最大内切圆以外的像素值置为0
    img:array(512,512,3)
    return:array(512,512,3)
    """
    h,w,_ = img.shape
    radius = int(min(h, w) / 2)  
    mask = np.zeros((h, w,3), np.uint8)  
    # 在mask中画出一个最大半径为radius的圆形区域
    cv2.circle(mask, (w // 2, h // 2), radius, (255, 255, 255), -1)  
    # 对原图和mask进行位运算,将圆形区域外的像素设置为0  
    img_process = cv2.bitwise_and(img, mask)
    return img_process

def image_feature(img):
    """
    iamge:(512,512,3)
    return: array(512,512)
    """
    rows,cols,_ = img.shape
    quaternion_array = np.array([[np.quaternion(0, img[i,j,0],img[i,j,1],img[i,j,2]) for j in range(cols)] for i in range(rows)])
    return np.fft.fftshift(fft2D(quaternion_array))
    
def exp_quaternion(u):
    """
    四元数的指数运算
    """
    # 手动计算四元数的模,并用它来规范化四元数
    norm_u = np.abs(u)
    v = u / (norm_u+(1e-80))
    # 计算指数形式的指数运算
    exponential_form = np.cos(norm_u) + v * np.sin(norm_u)
    return exponential_form

def fft1D(signal):
    """
    signal:为一维的四元数序列
    return:*
    """
    # 定义单位纯四元数 u = ai + bj + ck,其中 |u| = 1
    # 构建单位纯四元数
    # 第一种四元数论文常用单位四元数
    d1=3**(1/2)
    u_lum = qt.quaternion(0, 1/d1, 1/d1, 1/d1)
    # 第二种单位四元数
    d2=68**(1/2)
    u_perc=qt.quaternion(0, 0, -2/d2, 8/d2)
    N = len(signal)
    if N <= 1:
        return signal
    even = fft1D(signal[0::2])
    odd = fft1D(signal[1::2])
    #一维傅里叶变换公式
    T = [exp_quaternion(-2*u_lum * np.pi * k / N) * odd[k] for k in range(N // 2)]
    # T = [exp_quaternion(-2 * u_perc * np.pi * k / N) * odd[k] for k in range(N // 2)]
    return np.concatenate([even + T, even - T])
    
def fft2D(image):
    """
    image:四元数矩阵(256*256)
    return:返回经过傅里叶变换后的四元数矩阵
    """
    M, N = image.shape
    if M <= 1 and N <= 1:
        return image
    # FFT along rows
    rows = np.array([fft1D(row) for row in image])
    # FFT along columns
    cols = np.array([fft1D(col) for col in rows.T]).T
    return cols

def gen_hashing(feature_matrix,k):
    """
    选取振幅系数矩阵中间偏左上的矩阵作为特征。
    input:array (256,256)
    output:list (x)
    """
    coeff = []
    start = int(feature_matrix.shape[0]/2-k//2+1)
    for i in range(start,start+k):
        for j in range(start,start+k):
            coeff.append(feature_matrix[i][j].abs())
    return np.array([1 if coeff[i] >= coeff[i+1] else 0 for i in range(len(coeff)-1)])
    
def dist_img(h1,h2):
    return sum(np.abs(h1-h2))/len(h1)

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

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

相关文章

05_Qt资源文件添加

Qt资源文件添加 Qt 资源系统是一个跨平台的资源机制&#xff0c;用于将程序运行时所需要的资源以二进制的形式存储于可执行文件内部。如果你的程序需要加载特定的资源&#xff08;图标、文本翻译等&#xff09;&#xff0c;那么&#xff0c;将其放置在资源文件中&#xff0c;就…

10.Godot Input与自定义单例的使用

单例 单例是一个可以在任何一个脚本中对其进行直接访问的对象&#xff0c;分为内置单例与自定义单例。每个单例都是独一无二的对象。内置单例不是节点&#xff0c;主要成员是各类 Server&#xff0c;开发者可以使用它们直接控制游戏程序的图形与音效等内容。此外&#xff0c;还…

Keil中编译无error(有warning),但程序无法运行的一种情况

问题 void Run_Led(void) {HAL_GPIO_TogglePin(RUN_LED_GPIO_Port, RUN_LED_Pin);Delay_ms(500); }void StartDefaultTask(void *argument) {/* USER CODE BEGIN StartDefaultTask */char c;/* Infinite loop */for(;;){while(1) { Run_Led;}...}非常简单的一个程序&#xf…

直播回顾 | 长安链可验证数据库技术架构和代码解读

3月29日长安链可验证数据库技术架构和代码解读中&#xff0c;北京大学博士后研究员高健博带开发者一起了解了长安链可验证数据库的应用背景、设计实现方式和功能代码结构。 数据存证以及通过智能合约进行数据共享是目前联盟链最直接、最广泛的应用场景。在很多存证场景中&…

服务器如何开启远程连接?

服务器开启远程连接是网络管理中一项重要的功能。通过远程连接&#xff0c;用户可以在任何地方远程访问服务器&#xff0c;从而进行管理、维护和监控等操作。远程连接的开启可以为工作提供便利性和效率&#xff0c;但同时也带来了安全风险。确保远程连接的安全性和可靠性是至关…

html接入腾讯地图

1.申请key key申请地址&#xff1a;https://lbs.qq.com/dev/console/application/mine 官方文档 https://lbs.qq.com/webApi/javascriptGL/glGuide/glBasic 2.html接入示例 <!DOCTYPE html> <html lang"en"> <head><meta charset"U…

如何训练一个大语言模型(LLMs)

目录 前言大语言模型 Vs机器学习模型训练过程步骤1&#xff1a;数据策划&#xff08;Data Curation)步骤2&#xff1a;格式化与预处理步骤3&#xff1a;训练模型步骤4&#xff1a;模型评估 LLM Leaderboard[LLM Leaderboard 2024](https://www.vellum.ai/llm-leaderboard)[Open…

实时数仓选型

实时数仓选型 实时数仓选型第一版实时数仓选型第二版 实时数仓选型第一版 实时数仓分层: 计算框架:Flink;存储框架:消息队列(可以实时读取&可以实时写入)ODS:Kafka 使用场景:每过来一条数据,读取到并加工处理DIM: HBase 使用场景:事实表会根据主键获取一行维表数据(1.永…

6个好用的AI绘画网站,AI画画操作简单更好看

如今&#xff0c;越来越多的人在艺术领域选择使用AI绘画软件进行创作&#xff0c;这已经成为一种趋势。以下是几款好用的AI绘画软件&#xff0c;可以帮助你和你的小伙伴们的AI画画操作简单更好看。 下面先欣赏AI美图~ 爱制作AI: 独特优势&#xff1a;爱制作AI是爱制作AI拥有强…

网页视频录制技巧,这2个方法一定要收好!

“大家知道如何录制网页上的视频吗&#xff1f;我现在有一个重要的项目&#xff0c;需要录制一段在线视频作为参考。但是尝试了好几种方法&#xff0c;都没能成功。时间紧迫&#xff0c;我真的非常需要这个视频。大家有没有好的建议或者方法呢&#xff1f;谢谢了&#xff01;”…

UG10.如何设置鼠标滚轮操作模型放大缩小方向?

UG10.如何设置鼠标滚轮操作模型放大缩小方向呢&#xff1f;看一下具体操作步骤吧。 首先打开UG10.软件&#xff0c;在主菜单栏选择【文件】下拉菜单&#xff0c;选择【实用工具】。 点击【用户默认设置】。 文章源自四五设计网-https://www.45te.com/45545.html 选中【基本环…

分享基于鸿蒙OpenHarmony的Unity团结引擎应用开发赛

该赛题旨在鼓励更多开发者基于OpenHarmony4.x版本&#xff0c;使用团结引擎创造出精彩的游戏与应用。本次大赛分为“创新游戏”与“创新3D 化应用”两大赛道&#xff0c;每赛道又分“大众组”与“高校组”&#xff0c;让不同背景的开发者同台竞技。无论你是游戏开发者&#xff…

LabVIEW轴承表面缺陷检测系统

LabVIEW轴承表面缺陷检测系统 为了解决轴承生产中人工检测效率低下、误检率高的问题&#xff0c;实现了一套基于LabVIEW的轴承表面缺陷自动检测系统。该系统利用工业相机采集轴承图像&#xff0c;通过图像处理技术对轴承表面的划痕缺陷和倒角缺陷进行自动识别和分析&#xff0…

Linux中inode号与日志分析

一.inode号 1.inode表结构 元信息&#xff1a;每个文件的属性信息&#xff0c;比如&#xff1a;文件的大小&#xff0c;时间&#xff0c;类型&#xff0c;权限等&#xff0c;称为文件的元数据(meta data 元信息 ) 元数据是存放在inode&#xff08;index node&#xff09;表中…

【Java】Java基础 使用集合实现斗地主分牌

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 今天使用集合TreeSet来实现一个斗地主的分牌流程。 TreeSet集合的一个特点就是 元素有序&#xff0c;这样就方便我们分的牌自动排序。 0.思路 1.创建玩家手牌集合 我们到时候分的牌都存储在这里&#xff0c;但你可能会…

AI大模型探索之路-应用篇17:GLM大模型-大数据自助查询平台架构实践

文章目录 前言一、技术架构设计二、本地知识库准备三、SQLServer服务1. 数据库准备步骤1&#xff1a;安装MySQL数据库步骤2&#xff1a;启动MySQL数据库步骤3&#xff1a;登录MySQL数据库步骤4&#xff1a;创建数据库用户glm步骤5&#xff1a;给数据库用户赋权限步骤6&#xff…

前端CSS基础6(CSS列表与表格的相关属性,边框的样式调整)

前端CSS基础6&#xff08;CSS列表与表格的相关属性&#xff0c;边框的样式调整&#xff09; CSS列表相关属性CSS表格相关属性回忆表格边框相关属性单元格边框相关属性回忆单元格的跨行和跨列操作单元格边框的相关属性 CSS列表相关属性 在 CSS 中&#xff0c;列表&#xff08;L…

Hadoop3:大数据生态体系

一、技术层面 通过下面这张图&#xff0c;我们可以大概确定&#xff0c;在大数据行业里&#xff0c;自己的学习路线。 个人认为&#xff0c;Hadoop集群一旦搭建完工&#xff0c;基本就是个把人运维的事情 主要岗位应该是集中在数据计算层&#xff0c;尤其是实时计算&#xff…

Skill Check: Building Blocks for an LLM Application

Skill Check: Building Blocks for an LLM Application

docker 报错 error adding seccomp filter rule for syscall clone3

网上有一些说法&#xff0c;例如重新安装docker 但是我自己尝试&#xff0c;用 –security-opt seccompunconfined 就可以&#xff0c;但是需要把这个命令放到紧挨着run的位置&#xff0c;如果放到偏后的位置&#xff0c;可能不起作用。 以下命令是其他网友启动是的命令&…