zoukankan      html  css  js  c++  java
  • python 图片相似算法

    1、安装

    pip install opencv_python

    2、具体代码(借鉴)

    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
    
    
    if __name__ == '__main__':
        img1 = cv2.imread('./imgs/4.jpg')
        img2 = cv2.imread('./imgs/5.jpg')
        # hash1 = aHash(img1)
        # hash2 = aHash(img2)
        # print(hash1, type(hash1))
        # print(hash2, type(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))
  • 相关阅读:
    5804: 最大子序和(单调队列)
    5801: 七夕祭(贪心)
    5920: 喷水装置(贪心)
    5924: 加工生产调度(贪心)
    5929: 家庭作业(贪心+并查集)
    H1N1's Problem(费马小定理+快速幂)
    欧拉筛法求素数
    Cube Stacking(并查集加递归)
    写2个线程,一个打印1-52,一个打印A-Z,打印顺序是12A34B。。。(采用同步代码块和同步方法两种同步方法)
    java创建多线程的三种方式
  • 原文地址:https://www.cnblogs.com/wt7018/p/12564630.html
Copyright © 2011-2022 走看看