• 图像哈希: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) = {0,di<T1,Otherwise\\ 其中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_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))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
  • 相关阅读:
    灵活好用的sql monitoring 脚本 part4
    Python日学壹技:性能分析
    C++ 实用指南
    jmeter源码二次开发
    【2023.10.27练习】C语言-字符串转换
    02 【axios fetch 跨域】
    Node Sass version 9.0.0 is incompatible with ^4.0.0.
    设计模式:外观模式(C++实现)
    在gitee上建自己的博客
    python通用操作文章集合
  • 原文地址:https://blog.csdn.net/qq_60985893/article/details/138080109