图像哈希:全局+局部提取特征

这篇具有很好参考价值的文章主要介绍了图像哈希:全局+局部提取特征。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

文章信息
  1. 作者:梁小平,唐振军
  2. 期刊:ACM Trans. Multimedia Comput. Commun. Appl(三区)
  3. 题目:Robust Hashing via Global and Local Invariant Features for Image Copy Detection
目的、实验步骤及结论
  1. 目的:通过全局和局部提取特征来生成最终图像的哈希值。

  2. 实验步骤:
    图像哈希:全局+局部提取特征,科研篇:图像哈希,哈希算法,算法

    • 数据预处理:双线性插值(512 * 512)
    • 全局特征:
      • PDFT生成显著图S
      • 对GLCM使用四种参数(不同的角度)得到四个矩阵,每个矩阵得到4个统计特征,得到 1 * 16 的全局特征向量
    • 局部特征:
      • 使用HSV中的V分量,分块(64 * 64),将每一个块拼接成一个列向量,使用KPCA后得到d * N的矩阵。
      • 计算每一个矩阵维度的均值作为参考向量,计算所有向量(每一列)和参考向量的距离作为局部特征
    • 生成哈希值:将全局特征和局部特征进行拼接,使用量度排序作为最后的哈希值(长度为N+16)。
    • 相似性评价:使用汉明距离判断两张图片是否一致,若小于阈值则是相同图片。
  3. 结论

    • 首次提出KPCA应用于图像哈希
    • 适用于混合攻击
    • 全局特征对几何攻击(尤其是缩放和旋转)很敏感,而局部特征无法保持全局上下文信息导致判别效果不佳。
    • 使用全局和局部结合特征可以更加有利于互补进行提取特征。

本篇论文的实现代码如下:文章来源地址https://www.toymoban.com/news/detail-859873.html

def image_hash(img_path):
    img = processing(img_path)
    global_feature = global_feature_gen(img)
    local_feature = local_feature_gen(img, 10000, 4)
    h_i = gen_hashing(global_feature, local_feature)
    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), (512,512), 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), (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_BGR2RGB)
    out = cv2.cvtColor(out, cv2.COLOR_BGR2HSV)
    return out

def local_feature_gen(img, sigma, n_components):
    """
    iamge:(512,512,3)
    return: 降维之后的图像(d, N)
    """
    from sklearn.decomposition import PCA, KernelPCA
    N_list = []
    V = img[:,:,2]
    for i in range(0,V.shape[0],64):
        for j in range(0,V.shape[1],64):
            image_block = V[i:i+64, j:j+64]
            N_list.append(image_block.reshape(-1)[:])
    N_list = np.array(N_list).copy()
    # kernel_pca = KernelPCA(n_components=4, kernel="poly", gamma=10)
    # result = kernel_pca.fit_transform(N_list)
    result = kpca(N_list, sigma, 4).copy()
    return result.T
    
def gaussian_kernel(X, sigma):
    sq_dists = pdist(X, 'sqeuclidean')  # 计算所有样本点之间的平方欧式距离
    mat_sq_dists = squareform(sq_dists)  # 转换成矩阵形式
    return np.exp(-mat_sq_dists / (2 * sigma**2))  # 计算高斯核矩阵

def kpca(X, sigma, n_components):
    # 步骤1: 计算高斯核矩阵
    K = gaussian_kernel(X, sigma)
    # 步骤2: 中心化核矩阵
    N = K.shape[0]
    one_n = np.ones((N, N)) / N
    K = K - one_n.dot(K) - K.dot(one_n) + one_n.dot(K).dot(one_n)
    # 步骤3: 计算特征值和特征向量
    eigenvalues, eigenvectors = eigh(K)
    eigenvalues, eigenvectors = eigenvalues[::-1], eigenvectors[:, ::-1]  # 降序排列
    # 步骤4: 提取前n个特征向量
    alphas = eigenvectors[:, :n_components]
    lambdas = eigenvalues[:n_components]
    return alphas / np.sqrt(lambdas)  # 归一化特征向量

def global_feature_gen(img):
    P = pqft(img)
    return P
def pqft(img, sigma=8):
    h, w, channel = img.shape
    r, b, g = img[:,:,0], img[:,:,1], img[:,:,2]
    R = r - (g + b)/2
    G = g - (r + b)/2
    B = b - (r + g)/2
    Y = (r + g)/2 - (abs(r - g))/2 - b
    RG = R - G
    BY =B - Y
    I1 = ((r+g+b) /3)
    M = np.zeros((h, w))
    f1 = M + RG * 1j
    f2 = BY + I1 * 1j
    F1 = np.fft.fft2(f1)
    F2 = np.fft.fft2(f2)
    phaseQ1 = np.angle(F1)
    phaseQ2 = np.angle(F2)
    ifftq1 = np.fft.ifft2(np.exp(phaseQ1 * 1j))
    ifftq2 = np.fft.ifft2(np.exp(phaseQ2 * 1j))
    absq1 = np.abs(ifftq1)
    absq2 = np.abs(ifftq2)
    squareq=(absq1+absq2) * (absq1+absq2)
    out = cv2.GaussianBlur(squareq, (5, 5), sigma)
    out = cv2.normalize(out.astype('float'), None, 0, 255, cv2.NORM_MINMAX)
    return out

def gen_hashing(global_feature, local_feature):
    """
    先求出列均值,在算出每一列之间的距离,最后使用序数度量来代表哈希值
    input:array (x,64,64)
    output:list (x)
    """
    result = glcm(global_feature)
    y_mean = np.mean(local_feature, axis = 0)
    z = np.sqrt((y_mean[1:] - y_mean[:-1]) ** 2) * 1000
    result.extend(z)
    sorted_indices = sorted(range(len(result)), key=lambda i: result[i])
    result = [sorted_indices.index(i)+1 for i in range(len(result))]
    return result
    
def glcm(img, levels = 32):
    '''
    https://www.cnblogs.com/xiaoliang-333/articles/16937977.html
    graycom = greycomatrix(img, [1], [0, np.pi/4, np.pi/2, np.pi*3/4], levels=256)
    c = feature.greycoprops(graycom, 'contrast')  # 对比度
    d = feature.greycoprops(graycom, 'dissimilarity')   # 相异性
    h = feature.greycoprops(graycom, 'homogeneity')    # 同质性
    e = feature.greycoprops(graycom, 'energy')    # 能量
    corr = feature.greycoprops(graycom, 'correlation')    # 相关性
    ASM = feature.greycoprops(graycom, 'ASM')     # 角二阶矩
    '''
    from skimage.feature import graycomatrix, graycoprops
    img = img.astype(np.float64)
    img = img * levels / 256.0
    img = img.astype(np.uint8)
    distances = [1, 1, 1, 1]  
    angles = [0, 45, 90, 135] 
    #初始化一个空列表来存储GLCM矩阵统计特征
    glcms = []
    #为每个距离和角度组合计算 GLCM
    for d,a in zip(distances,angles):
        glcm = graycomatrix(img,distances=[d],angles=[a],levels=levels,symmetric=True, normed=True)
        contrast = graycoprops(glcm, 'ASM')     
        glcms.append(contrast[0, 0])
        
        correlation = graycoprops(glcm, 'contrast')  
        glcms.append(correlation[0, 0])
        
        energy = graycoprops(glcm, 'correlation')    
        glcms.append(energy[0, 0])
        
        homogeneity = graycoprops(glcm, 'homogeneity')    
        glcms.append(homogeneity[0, 0])
    # return np.array(np.round(glcms), dtype=np.uint8)
    return glcms

def dist_img(h1,h2):
    # distance = np.count_nonzero(np.array(list(h1)) != np.array(list(h2)))
    # return distance / len(h1)
    h1 = np.array(h1)
    h2 = np.array(h2)
    return sum(np.abs(h1-h2))/len(h1)

到了这里,关于图像哈希:全局+局部提取特征的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Lesson4-3:OpenCV图像特征提取与描述---SIFT/SURF算法

    学习目标 理解 S I F T / S U R F SIFT/SURF S I FT / S U RF 算法的原理, 能够使用 S I F T / S U R F SIFT/SURF S I FT / S U RF 进行关键点的检测 1.1 SIFT原理 前面两节我们介绍了 H a r r i s Harris H a rr i s 和 S h i − T o m a s i Shi-Tomasi S hi − T o ma s i 角点检测算法,这两种算法具有旋转不变性,但不具

    2024年02月09日
    浏览(32)
  • 局部特征匹配(LoFTR) & 基于全局匹配的光流学习(GMFlow)

    Project: https://zju3dv.github.io/loftr/、 https://github.com/haofeixu/gmflow 在计算机视觉中,特征匹配任务是对两幅图像中的特征点进行匹配,预测的结果通常是一个坐标对,即将两幅图像中的对应特征点匹配起来,形成的一对坐标。 稀疏匹配是指仅在关键点(如角点、边缘点等)附近匹

    2024年02月06日
    浏览(41)
  • 【计算机视觉、关键点检测、特征提取和匹配】基于SIFT、PCA-SIFT和GLOH算法在不同图像之间建立特征对应关系,并实现点匹配算法和图像匹配(Matlab代码实现)

    💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码、数据、文章

    2024年03月14日
    浏览(38)
  • c++ OpenCV——提取图像的局部区域

    有时候整幅图像需要采取局部,如何进行采取呢。方案如下: 确定裁剪区域的大下 将原图copy一份,原图备用,防止损坏 将copy的图进行裁剪 原图: copy图及需要裁剪的部分: 裁剪图:

    2024年02月09日
    浏览(32)
  • DiffMIC:融合局部和全局分析,基于扩散模型的医学图像分类方法

      论文链接:https://arxiv.org/pdf/2303.10610.pdf 代码链接:https://github.com/scott-yjyang/DiffMIC   问题1 :在医学图像分类中,我们需要 超精确 地识别和区分图像中的病变区域和正常组织。 解法 :DiffMIC 采用了双粒度条件引导(DCG)。 之所以用双粒度条件引导(DCG)解法 ,是因为医学

    2024年01月21日
    浏览(39)
  • 机器学习图像特征提取—SIFT特征提取原理及代码实现

    目录 1 SIFT简介 2 SIFT原理及特点 2.1 SIFT算法特点 2.2 SIFT特征检测 3 SIFT代码实现        SIFT,即尺度不变特征变换(Scale-invariant feature transform,SIFT),是用于图像处理领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子。       SIF

    2024年02月06日
    浏览(32)
  • Opencv图像特征点提取(

            目录 特征点分类 1 ORB ①特征点检测 ②计算特征描述 2 SIFT 1 SIFT特征检测的步骤 ①.在DOG尺度空间中获取极值点,即关键点。 ②.特征点方向估计 ③生成特征描述 ④.代码实现 3.SURF ①.SURF的介绍 ②.SURF算法步骤 ③. SIFT与SURF效果比较 ④代码实现 4 FAST角点检测且阈值可

    2024年02月14日
    浏览(32)
  • 机器视觉(八):图像特征提取

    目录: 机器视觉(一):概述 机器视觉(二):机器视觉硬件技术 机器视觉(三):摄像机标定技术 机器视觉(四):空域图像增强 机器视觉(五):机器视觉与世界杯 机器视觉(六):频域图像增强 机器视觉(七):图像分割 机器视觉(八):图像特征提取 机器视觉

    2024年02月09日
    浏览(50)
  • 机器学习图像特征提取—颜色(RGB、HSV、Lab)特征提取并绘制直方图

    目录 1 颜色特征 1.1 RGB色彩空间 1.2 HSV色彩空间 1.3 Lab色彩空间 2 使用opencv-python对图像颜色特征提取并绘制直方图 2.1 RGB颜色特征和直方图 2.2 HSV颜色特征和直方图 2.3 Lab颜色特征和直方图 RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以

    2024年02月08日
    浏览(31)
  • 计算机视觉之图像特征提取

    图像特征提取是计算机视觉中的重要任务,它有助于识别、分类、检测和跟踪对象。以下是一些常用的图像特征提取算法及其简介: 颜色直方图(Color Histogram) : 简介 :颜色直方图表示图像中各种颜色的分布情况。通过将图像中的像素分成颜色通道(如RGB)并计算每个通道

    2024年02月12日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包