图像哈希:DCT篇

2024-04-22 22:20
文章标签 图像 哈希 dct

本文主要是介绍图像哈希: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))

这篇关于图像哈希:DCT篇的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/927022

相关文章

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.

C/C++的OpenCV 进行图像梯度提取的几种实现

《C/C++的OpenCV进行图像梯度提取的几种实现》本文主要介绍了C/C++的OpenCV进行图像梯度提取的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录预www.chinasem.cn备知识1. 图像加载与预处理2. Sobel 算子计算 X 和 Y

c/c++的opencv图像金字塔缩放实现

《c/c++的opencv图像金字塔缩放实现》本文主要介绍了c/c++的opencv图像金字塔缩放实现,通过对原始图像进行连续的下采样或上采样操作,生成一系列不同分辨率的图像,具有一定的参考价值,感兴... 目录图像金字塔简介图像下采样 (cv::pyrDown)图像上采样 (cv::pyrUp)C++ O

Java如何将文件内容转换为MD5哈希值

《Java如何将文件内容转换为MD5哈希值》:本文主要介绍Java如何将文件内容转换为MD5哈希值的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java文件内容转换为MD5哈希值一个完整的Java示例代码代码解释注意事项总结Java文件内容转换为MD5

Python+wxPython构建图像编辑器

《Python+wxPython构建图像编辑器》图像编辑应用是学习GUI编程和图像处理的绝佳项目,本教程中,我们将使用wxPython,一个跨平台的PythonGUI工具包,构建一个简单的... 目录引言环境设置创建主窗口加载和显示图像实现绘制工具矩形绘制箭头绘制文字绘制临时绘制处理缩放和旋转缩放旋转保存编

python+OpenCV反投影图像的实现示例详解

《python+OpenCV反投影图像的实现示例详解》:本文主要介绍python+OpenCV反投影图像的实现示例详解,本文通过实例代码图文并茂的形式给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前言二、什么是反投影图像三、反投影图像的概念四、反向投影的工作原理一、利用反向投影backproj

使用Python实现图像LBP特征提取的操作方法

《使用Python实现图像LBP特征提取的操作方法》LBP特征叫做局部二值模式,常用于纹理特征提取,并在纹理分类中具有较强的区分能力,本文给大家介绍了如何使用Python实现图像LBP特征提取的操作方... 目录一、LBP特征介绍二、LBP特征描述三、一些改进版本的LBP1.圆形LBP算子2.旋转不变的LB

OpenCV图像形态学的实现

《OpenCV图像形态学的实现》本文主要介绍了OpenCV图像形态学的实现,包括腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽运算和黑帽运算,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起... 目录一、图像形态学简介二、腐蚀(Erosion)1. 原理2. OpenCV 实现三、膨胀China编程(

使用Python开发一个图像标注与OCR识别工具

《使用Python开发一个图像标注与OCR识别工具》:本文主要介绍一个使用Python开发的工具,允许用户在图像上进行矩形标注,使用OCR对标注区域进行文本识别,并将结果保存为Excel文件,感兴... 目录项目简介1. 图像加载与显示2. 矩形标注3. OCR识别4. 标注的保存与加载5. 裁剪与重置图像

基于WinForm+Halcon实现图像缩放与交互功能

《基于WinForm+Halcon实现图像缩放与交互功能》本文主要讲述在WinForm中结合Halcon实现图像缩放、平移及实时显示灰度值等交互功能,包括初始化窗口的不同方式,以及通过特定事件添加相应... 目录前言初始化窗口添加图像缩放功能添加图像平移功能添加实时显示灰度值功能示例代码总结最后前言本文将