zoukankan      html  css  js  c++  java
  • python-两个图片相似度算法

    # -*- coding: UTF-8 -*-
    """
         作者:zxj
         版本:1.0
         日期:19-3-24
    """
    import cv2
    import numpy as np
    #均值哈希算法
    def aHash(img):
        # 缩放为8*8
        img = cv2.resize(img, (8, 8), interpolation=cv2.INTER_CUBIC)
        # 转换为灰度图
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        # s为像素和初值为0,hash_str为hash值初值为''
        s = 0
        hash_str = ''
        # 遍历累加求像素和
        for i in range(8):
            for j in range(8):
                s = s + gray[i, j]
        # 求平均灰度
        avg = s / 64
        # 灰度大于平均值为1相反为0生成图片的hash值
        for i in range(8):
            for j in range(8):
                if gray[i, j] > avg:
                    hash_str = hash_str + '1'
                else:
                    hash_str = hash_str + '0'
        return hash_str
    #差值感知算法
    def dHash(img):
        #缩放8*8
        img=cv2.resize(img,(9,8),interpolation=cv2.INTER_CUBIC)
        #转换灰度图
        gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
        hash_str=''
        #每行前一个像素大于后一个像素为1,相反为0,生成哈希
        for i in range(8):
            for j in range(8):
                if   gray[i,j]>gray[i,j+1]:
                    hash_str=hash_str+'1'
                else:
                    hash_str=hash_str+'0'
        return hash_str
    
    #Hash值对比
    def cmpHash(hash1,hash2):
        n=0
        #hash长度不同则返回-1代表传参出错
        if len(hash1)!=len(hash2):
            return -1
        #遍历判断
        for i in range(len(hash1)):
            #不相等则n计数+1,n最终为相似度
            if hash1[i]!=hash2[i]:
                n=n+1
        return n
    
    img1=cv2.imread('A.jpg')
    img2=cv2.imread('C.jpg')
    hash1= aHash(img1)
    hash2= aHash(img2)
    print(hash1)
    print(hash2)
    n=cmpHash(hash1,hash2)
    print ('均值哈希算法相似度:'+ str(n))
    
    hash1= dHash(img1)
    hash2= dHash(img2)
    print(hash1)
    print(hash2)
    n=cmpHash(hash1,hash2)
    print ('差值哈希算法相似度:'+ str(n))
    
    #相似度越小,说明两张图片越相似

    
    
  • 相关阅读:
    HDOJ 2871 Memory Control(线段树区间合并与查询)
    POJ 3468 A Simple Problem with Integers(线段树成段更新)
    POJ 2923 Relocation(状态压缩 + 两次DP)
    POJ 1436 Horizontally Visible Segments(线段树区间染色查询)
    POJ 2528 Mayor's posters(离散化的线段树)
    HDOJ 3308 LCIS(线段树区间合并与查询)
    异常处理的指导原则
    CSC命令
    .NET命名空间举例
    System.DateTime
  • 原文地址:https://www.cnblogs.com/zhouxuejia/p/10590058.html
Copyright © 2011-2022 走看看