Python 五种图片相似度比较方法
均值哈希算法
# -*- coding: utf-8 -*-
import cv2
import numpy as np# Hash值对比
def cmpHash(hash1, hash2,shape=(10,10)):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 + 1return n/(shape[0]*shape[1])
# 均值哈希算法
def aHash(img,shape=(10,10)):# 缩放为10*10img = cv2.resize(img, shape)# 转换为灰度图gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# s为像素和初值为0,hash_str为hash值初值为''s = 0hash_str = ''# 遍历累加求像素和for i in range(shape[0]):for j in range(shape[1]):s = s + gray[i, j]# 求平均灰度avg = s / 100# 灰度大于平均值为1相反为0生成图片的hash值for i in range(shape[0]):for j in range(shape[1]):if gray[i, j] > avg:hash_str = hash_str + '1'else:hash_str = hash_str + '0'return hash_str
def main():img1 = cv2.imread('328/0003.jpg') img2 = cv2.imread('328/0004.jpg')hash1 = aHash(img1)hash2 = aHash(img2)n = cmpHash(hash1, hash2)print('均值哈希算法相似度:', n)if __name__=="__main__":main()
说明:
首先,将一张图片大小调整为10x10,然后转化为灰度图。
接着,求出平均灰度,大于平均灰度值更改为1,反之为0,生成哈希值。
随后,对比两个图片矩阵的相似度,最后返回相似百分比
差值哈希算法
# -*- coding: utf-8 -*-
import cv2
import numpy as np# Hash值对比
def cmpHash(hash1, hash2,shape=(10,10)):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 + 1return n/(shape[0]*shape[1])
# 差值感知算法
def dHash(img,shape=(10,10)):# 缩放10*11img = cv2.resize(img, (shape[0]+1, shape[1]))# 转换灰度图gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)hash_str = ''# 每行前一个像素大于后一个像素为1,相反为0,生成哈希for i in range(shape[0]):for j in range(shape[1]):if gray[i, j] > gray[i, j + 1]:hash_str = hash_str + '1'else:hash_str = hash_str + '0'return hash_strdef main():img1 = cv2.imread('328/0003.jpg') img2 = cv2.imread('328/0004.jpg')hash1 = dHash(img1)hash2 = dHash(img2)n = cmpHash(hash1, hash2)print('均值哈希算法相似度:', n)if __name__=="__main__":main()
说明:
首先,将一张图片大小调整为10x11,然后转化为灰度图。
接着,比较每行当前值与相邻的下一个值的大小。如果当前值比较大,灰度值更改为1,反之为0,生成哈希值。。
随后,对比两个图片矩阵的相似度,最后返回相似百分比
感知哈希算法
# -*- coding: utf-8 -*-
import cv2
import numpy as np# Hash值对比
def cmpHash(hash1, hash2,shape=(10,10)):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 + 1return n/(shape[0]*shape[1])
# 感知哈希算法(pHash)
def pHash(img,shape=(10,10)):# 缩放32*32img = cv2.resize(img, (32, 32)) # , interpolation=cv2.INTER_CUBIC# 转换为灰度图gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 将灰度图转为浮点型,再进行dct变换dct = cv2.dct(np.float32(gray))# opencv实现的掩码操作dct_roi = dct[0:10, 0:10]hash = []avreage = np.mean(dct_roi)for i in range(dct_roi.shape[0]):for j in range(dct_roi.shape[1]):if dct_roi[i, j] > avreage:hash.append(1)else:hash.append(0)return hashdef main():img1 = cv2.imread('328/0003.jpg') img2 = cv2.imread('328/0004.jpg')hash1 = pHash(img1)hash2 = pHash(img2)n = cmpHash(hash1, hash2)print('感知哈希算法相似度:', n)if __name__=="__main__":main()
说明:
首先,将一张图片大小调整为32x32,然后转化为灰度图,进行离散余弦变换(dct)变换。
接着,opencv实现10x10掩码操作,并求出掩码区域均值,掩码区域像素值大于平均值掩码区域矩阵值设为1,反之为0。
随后,对比两个图片矩阵的相似度,最后返回相似百分比
三直方图算法相似度
# -*- coding: utf-8 -*-
import cv2
import numpy as np# 通过得到RGB每个通道的直方图来计算相似度
def classify_hist_with_split(image1, image2, size=(256, 256)):# 将图像resize后,分离为RGB三个通道,再计算每个通道的相似值image1 = cv2.resize(image1, size)image2 = cv2.resize(image2, size)sub_image1 = cv2.split(image1)sub_image2 = cv2.split(image2)sub_data = 0for im1, im2 in zip(sub_image1, sub_image2):sub_data += calculate(im1, im2)sub_data = sub_data / 3return sub_data# 计算单通道的直方图的相似值
def calculate(image1, image2):hist1 = cv2.calcHist([image1], [0], None, [256], [0.0, 255.0])hist2 = cv2.calcHist([image2], [0], None, [256], [0.0, 255.0])# 计算直方图的重合度degree = 0for i in range(len(hist1)):if hist1[i] != hist2[i]:degree = degree + (1 - abs(hist1[i] - hist2[i]) / max(hist1[i], hist2[i]))else:degree = degree + 1degree = degree / len(hist1)return degreedef main():img1 = cv2.imread('328/0003.jpg') img2 = cv2.imread('328/0004.jpg')n = classify_hist_with_split(img1, img2)print('三直方图算法相似度:', n[0])if __name__=="__main__":main()
说明:
首先,将一张图片大小调整为256x256,并分离出rgb三个通道数组。
接着,使用图像直方图的函数,直方图均衡化,计算出0-255的数值
随后,对比两个图片直方图的重合度,最后返回相似百分比
单通道的直方图算法
# -*- coding: utf-8 -*-
import cv2
import numpy as np# 计算单通道的直方图的相似值
def calculate(image1, image2):hist1 = cv2.calcHist([image1], [0], None, [256], [0.0, 255.0])hist2 = cv2.calcHist([image2], [0], None, [256], [0.0, 255.0])# 计算直方图的重合度degree = 0for i in range(len(hist1)):if hist1[i] != hist2[i]:degree = degree + (1 - abs(hist1[i] - hist2[i]) / max(hist1[i], hist2[i]))else:degree = degree + 1degree = degree / len(hist1)return degreedef main():img1 = cv2.imread('328/0003.jpg') img2 = cv2.imread('328/0004.jpg')n = calculate(img1, img2)print('单通道的直方图算法相似度:', n[0])if __name__=="__main__":main()
说明:
首先,输入一张图片,使用rgb三个通道的某一个通道。
接着,使用图像直方图的函数,直方图均衡化,计算出0-255的数值
随后,对比两个图片直方图的重合度,最后返回相似百分比
全部代码
# -*- coding: utf-8 -*-
import cv2
import numpy as np# 均值哈希算法
def aHash(img,shape=(10,10)):# 缩放为10*10img = cv2.resize(img, shape)# 转换为灰度图gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# s为像素和初值为0,hash_str为hash值初值为''s = 0hash_str = ''# 遍历累加求像素和for i in range(shape[0]):for j in range(shape[1]):s = s + gray[i, j]# 求平均灰度avg = s / 100# 灰度大于平均值为1相反为0生成图片的hash值for i in range(shape[0]):for j in range(shape[1]):if gray[i, j] > avg:hash_str = hash_str + '1'else:hash_str = hash_str + '0'return hash_str# 差值感知算法
def dHash(img,shape=(10,10)):# 缩放10*11img = cv2.resize(img, (shape[0]+1, shape[1]))# 转换灰度图gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)hash_str = ''# 每行前一个像素大于后一个像素为1,相反为0,生成哈希for i in range(shape[0]):for j in range(shape[1]):if gray[i, j] > gray[i, j + 1]:hash_str = hash_str + '1'else:hash_str = hash_str + '0'return hash_str# 感知哈希算法(pHash)
def pHash(img,shape=(10,10)):# 缩放32*32img = cv2.resize(img, (32, 32)) # , interpolation=cv2.INTER_CUBIC# 转换为灰度图gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 将灰度图转为浮点型,再进行dct变换dct = cv2.dct(np.float32(gray))# opencv实现的掩码操作dct_roi = dct[0:10, 0:10]hash = []avreage = np.mean(dct_roi)for i in range(dct_roi.shape[0]):for j in range(dct_roi.shape[1]):if dct_roi[i, j] > avreage:hash.append(1)else:hash.append(0)return hash# 通过得到RGB每个通道的直方图来计算相似度
def classify_hist_with_split(image1, image2, size=(256, 256)):# 将图像resize后,分离为RGB三个通道,再计算每个通道的相似值image1 = cv2.resize(image1, size)image2 = cv2.resize(image2, size)sub_image1 = cv2.split(image1)sub_image2 = cv2.split(image2)sub_data = 0for im1, im2 in zip(sub_image1, sub_image2):sub_data += calculate(im1, im2)sub_data = sub_data / 3return sub_data# 计算单通道的直方图的相似值
def calculate(image1, image2):hist1 = cv2.calcHist([image1], [0], None, [256], [0.0, 255.0])hist2 = cv2.calcHist([image2], [0], None, [256], [0.0, 255.0])# 计算直方图的重合度degree = 0for i in range(len(hist1)):if hist1[i] != hist2[i]:degree = degree + (1 - abs(hist1[i] - hist2[i]) / max(hist1[i], hist2[i]))else:degree = degree + 1degree = degree / len(hist1)return degree# Hash值对比
def cmpHash(hash1, hash2,shape=(10,10)):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 + 1return n/(shape[0]*shape[1])def main():img1 = cv2.imread('328/0003.jpg') img2 = cv2.imread('328/0004.jpg')hash1 = aHash(img1)hash2 = aHash(img2)n = cmpHash(hash1, hash2)print('均值哈希算法相似度:', n)hash1 = dHash(img1)hash2 = dHash(img2)n = cmpHash(hash1, hash2)print('差值哈希算法相似度:', n)hash1 = pHash(img1)hash2 = pHash(img2)n = cmpHash(hash1, hash2)print('感知哈希算法相似度:', n)n = classify_hist_with_split(img1, img2)print('三直方图算法相似度:', n[0])n = calculate(img1, img2)print('单通道的直方图算法相似度:', n[0])if __name__=="__main__":main()#经测试均值哈希算法与三直方图算法相似度效果较好
参考,https://blog.csdn.net/enter89/article/details/90293971
Python 五种图片相似度比较方法相关推荐
- python五种调试或排错的方法
1.print,直接打印,比较简单而且粗暴 在代码中直接输入print+需要输出的结果,根据打印的内容判断即可 2.assert断言,很方便,测试人员常常在写自动化用例的时候用的比较多 如下,直接将预 ...
- python两条曲线图片相似度_Python比较两个图片相似度的方法
本文实例讲述了Python比较两个图片相似度的方法.分享给大家供大家参考.具体分析如下: 这段代码实用pil模块比较两个图片的相似度,根据实际实用,代码虽短但效果不错,还是非常靠谱的,前提是图片要大一 ...
- Python语言学习:基于python五种方法实现使用某函数名【func_01】的字符串格式('func_01')来调用该函数【func_01】执行功能
Python语言学习:基于python五种方法实现使用某函数名[func_01]的字符串格式('func_01')来调用该函数[func_01]执行功能 目录 问题提出 代码五种设计思路 T1方法:e ...
- python图像分析_python分析问题步骤Python比较两个图片相似度的方法
本文实例讲述了Python比较两个图片相似度的方法.分享给大家供大家参考.具体分析如下: 这段代码实用pil模块比较两个图片的相似度,根据实际实用,代码虽短但效果不错,还是非常靠谱的,前提是图片要大一 ...
- python五种可视化工具及六道常见面试题
2017-12-26 吊炸天的 [Python五种可视化工具] 在 Python 中,将数据可视化有多种选择,正是因为这种多样性,何时选用何种方案才变得极具挑战性.本文包含了一些较为流行的工具以及 ...
- 五种WordPress防止垃圾评论方法-过滤垃圾评论提高WP运行效率
点击上方蓝字"优派编程"选择"加为星标",第一时间关注原创干货 最近小编wp后台老是收到烦人的文章垃圾评论,并且评论是机器人发过来的.请看下图: 为了防止对方机 ...
- 怎么将PDF转Word?快速掌握这五种免费PDF转Word方法!
这五种免费PDF转Word方法,不仅免费,还能准确复原PDF文件内容,前方高能,赶快学习吧! 转换方法1.Office转换法 大厂软件,既能阅读文档又能转换格式,总是让人放心. 转换步骤1:在Word ...
- python修改图片,Python之修改图片像素值的方法
在做语义分割项目时,标注的图片不合标准,而且类型是RGBA型,且是A的部分表示的类别,因此需要将该图片转化为RGB图片 # -*- coding:utf8 -*- import os from PIL ...
- 模糊照片如何修复?分享两种图片变清晰的方法
在我们日常生活中,难免会遇到一些照片因为拍摄环境不好或是保存方式不当而变得模糊不清.这时候,我们就需要一些技巧来修复这些模糊照片,让它们变得更加清晰明亮.下面,我将分享两种图片变清晰的方法. 方法一: ...
最新文章
- HarmonyOS UI开发 TableLayout(表格布局) 的使用
- List 去除重复数据的五种方式,舒服~
- python自动华 (七)
- 动态规划算法经典例题_c动态规划精简例题
- 【推荐】DBA必须了解的11g中的一些变化
- 汤小丹计算机操作系统慕课版课后题答案第四章:进程同步
- win10 html字体设置,IT之家学院:如何解决Win10屏幕字体缩放模糊问题
- snownlp 原理_snownlp入门
- 史上最全SpringCloud2.0视频教程
- 遍历出List<Map>的Key / Value
- android手机控制电视,类Siri语音控制技术 Android手机也能控制电视
- 无语的index hint:手工分配哈希区,5小时不出结果,优化后20分钟
- numpy函数:arange(),reshape()用法,
- 如何在微信h5拉起支付宝支付界面
- jav学习日记:多线程(一)
- coward的个人简介
- 松下A6伺服驱动器MADLN15SE与欧姆龙PLC的连接和试运行
- golang中匿名组合
- python loop call soon_python中call方法怎么使用?
- google/Chrome浏览器如何查看保存在网页上的密码
热门文章
- TAU到新的MME导致的被拒10(Implicitly detached,隐式分离)
- 【Python百日基础系列】Day20 - Pandas 数据可视化(2)
- 函数sleep、nanosleep和clock_nanosleep(UNIX环境高级编程笔记)
- CSS中的position定位属性
- CSRF Tester工具使用教程
- webpack静态资源地址注入html,HtmlWebpackPlugin
- MacBook音量标志下方出现禁止符号
- 等待着融博的offer
- 成都市等市、州2015年《工程量清单计价定额》人工费调整批复〔2017〕24
- Dubbo原理解析(非常透彻)