图像哈希: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

论文中实现的代码如下:

python 复制代码
def image_hash(img_path):
    img = processing(img_path)
    C_r_list = image_feature(img)
    h_i = gen_hashing(C_r_list)
    return h_i

def 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]])/16
    out = cv2.filter2D(img, -1 , kernel=kernel)  # 二维滤波器
    out = cv2.cvtColor(out, cv2.COLOR_BGR2HLS)
    return out

def 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))
相关推荐
凤枭香2 小时前
Python OpenCV 傅里叶变换
开发语言·图像处理·python·opencv
ctrey_3 小时前
2024-11-4 学习人工智能的Day21 openCV(3)
人工智能·opencv·学习
可均可可4 小时前
C++之OpenCV入门到提高004:Mat 对象的使用
c++·opencv·mat·imread·imwrite
蒙娜丽宁4 小时前
《Python OpenCV从菜鸟到高手》——零基础进阶,开启图像处理与计算机视觉的大门!
python·opencv·计算机视觉
好喜欢吃红柚子4 小时前
万字长文解读空间、通道注意力机制机制和超详细代码逐行分析(SE,CBAM,SGE,CA,ECA,TA)
人工智能·pytorch·python·计算机视觉·cnn
plmm烟酒僧5 小时前
Windows下QT调用MinGW编译的OpenCV
开发语言·windows·qt·opencv
AI小杨5 小时前
【车道线检测】一、传统车道线检测:基于霍夫变换的车道线检测史诗级详细教程
人工智能·opencv·计算机视觉·霍夫变换·车道线检测
冷凝女子6 小时前
【QT】海康视频及openCv抓拍正脸接口
qt·opencv·音视频·海康
撞南墙者8 小时前
OpenCV自学系列(1)——简介和GUI特征操作
人工智能·opencv·计算机视觉
王哈哈^_^8 小时前
【数据集】【YOLO】【VOC】目标检测数据集,查找数据集,yolo目标检测算法详细实战训练步骤!
人工智能·深度学习·算法·yolo·目标检测·计算机视觉·pyqt