简述

前段时间写了篇博文 哈希算法实现图像相似度比较(Python&OpenCV) ,使用简单的哈希算法进行图像相似度判断。但是在实践中该算法达不到预期的效果:

图像缩放8*8大小,图片信息内容严重丢失

64位Hash值对比,计算出结果在[0,64]之内,很难大程度区分图像特征

因为存在以上问题,所以想自己尝试改进一下算法,尽可能提高算法的准确性。

算法逻辑

缩放图片

将需要处理的图片所放到指定尺寸,缩放后图片大小由图片的信息量和复杂度决定。譬如,一些简单的图标之类图像包含的信息量少,复杂度低,可以缩放小一点。风景等复杂场景信息量大,复杂度高就不能缩放太小,容易丢失重要信息。根据自己需求,弹性的缩放。在效率和准确度之间维持平衡。

灰度处理

通常对比图像相似度和颜色关系不是很大,所以处理为灰度图,减少后期计算的复杂度。如果有特殊需求则保留图像色彩。

计算平均值

此处开始,与传统的哈希算法不同:分别依次计算图像每行像素点的平均值,记录每行像素点的平均值。每一个平均值对应着一行的特征。

计算方差

对得到的所有平均值进行计算方差,得到的方差就是图像的特征值。方差可以很好的反应每行像素特征的波动,既记录了图片的主要信息。

比较方差

经过上面的计算之后,每张图都会生成一个特征值(方差)。到此,比较图像相似度就是比较图像生成方差的接近成程度。

一组数据方差的大小可以判断稳定性,多组数据方差的接近程度可以反应数据波动的接近程度。我们不关注方差的大小,只关注两个方差的差值的大小。方差差值越小图像越相似!

代码实现

使用python&Opencv对上述算法进行实现

获取图像每行像素平均值

#获取每行像素平均值

def getdiff(img):

#定义边长

Sidelength=30

#缩放图像

img=cv2.resize(img,(Sidelength,Sidelength),interpolation=cv2.INTER_CUBIC)

#灰度处理

gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

#avglist列表保存每行像素平均值

avglist=[]

#计算每行均值,保存到avglist列表

for i in range(Sidelength):

avg=sum(gray[i])/len(gray[i])

avglist.append(avg)

#返回avglist平均值

计算图像特征值(方差)

#计算方差

def getss(list):

#计算平均值

avg=sum(list)/len(list)

#定义方差变量ss,初值为0

ss=0

#计算方差

for l in list:

ss+=(l-avg)*(l-avg)/len(list)

#返回方差

return ss

实例演示

两张原图如下:

图一

图二

为了便于观察,将两个图像每行像素值平均值在折线图上进行描绘,更能直观的比较均值的波动性,既图像的相似度。

方差如下

演示程序完整代码如下

import cv2

import matplotlib.pyplot as plt

#计算方差

def getss(list):

#计算平均值

avg=sum(list)/len(list)

#定义方差变量ss,初值为0

ss=0

#计算方差

for l in list:

ss+=(l-avg)*(l-avg)/len(list)

#返回方差

return ss

#获取每行像素平均值

def getdiff(img):

#定义边长

Sidelength=30

#缩放图像

img=cv2.resize(img,(Sidelength,Sidelength),interpolation=cv2.INTER_CUBIC)

#灰度处理

gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

#avglist列表保存每行像素平均值

avglist=[]

#计算每行均值,保存到avglist列表

for i in range(Sidelength):

avg=sum(gray[i])/len(gray[i])

avglist.append(avg)

#返回avglist平均值

return avglist

#读取测试图片

img1=cv2.imread("F:\test\walk01.jpg")

diff1=getdiff(img1)

print('img1:',getss(diff1))

#读取测试图片

img11=cv2.imread("F:\test\walk03.jpg")

diff11=getdiff(img11)

print('img11:',getss(diff11))

x=range(30)

plt.figure("avg")

plt.plot(x,diff1,marker="*",label="$walk01$")

plt.plot(x,diff11,marker="*",label="$walk03$")

plt.title("avg")

plt.legend()

plt.show()

cv2.waitKey(0)

cv2.destroyAllWindows()

以上仅个人见解,不足之处望大家批评指正!

pythonopencv人脸相似度_图像相似度算法的个人见解(pythonopencv)-Go语言中文社区...相关推荐

  1. python爬取旅游信息_用Python爬取分析全国旅游数据-Go语言中文社区

    前言: Python对于本人来讲也是一个在逐渐学习掌握的过程,这次的内容就从旅游开始讲起,进入正文前首先附(fang)上(du)最令我垂涎欲滴的海鲜盛宴. 数据爬取: 最近几天朋友圈被大家的旅行足迹刷 ...

  2. 利用python爬取58同城简历数据_利用python爬取58同城简历数据-Go语言中文社区

    利用python爬取58同城简历数据 最近接到一个工作,需要获取58同城上面的简历信息(http://gz.58.com/qzyewu/).最开始想到是用python里面的scrapy框架制作爬虫.但 ...

  3. r语言把两个折线图图像放到一个图里_图像相似度度量

    图像相似度度量的应用场景很多,包括以图搜图,相似图像去重等多种功能,目前在项目中的场景是针对大量重复类似的图片,需要进行筛选剔除,自然需要用到图像相似度,简单调研了下图像相似度的方法,包括传统图像方法 ...

  4. java 圈复杂度_圈复杂度和代码质量优化(附带示例代码纠正代码质量)

    什么是圈复杂度? --------------------------------------- 圈复杂度(Cyclomatic Complexity)是衡量计算机程序复杂程度的一种措施.它根据程序从 ...

  5. matlab 图像平滑的算法_图像相似度---灰度分布算法---用matlab实现

    基于matlab2020b,不同版本可能会出错 步骤: 读取图片数据(相当于一个矩阵) 匹配两张图片的尺寸 用imhist函数画出灰度分布图 将灰度分布图归一化 计算巴氏距离得到相似度 代码实现: c ...

  6. 分布的matlab实现_图像相似度---灰度分布算法---用matlab实现

    基于matlab2020b,不同版本可能会出错 步骤: 读取图片数据(相当于一个矩阵) 匹配两张图片的尺寸 用imhist函数画出灰度分布图 将灰度分布图归一化 计算巴氏距离得到相似度 代码实现: c ...

  7. mfc 二进制转换成图像_图像相似度---感知哈希算法(phash)---用matlab实现

    基于matlab2020b,不同版本可能会出错 步骤: 读取图片数据(相当于一个矩阵) 转换成灰度图片(256级) 缩放到32×32尺寸(剔除图片细节) 计算二维离散余弦变换(变换后还是32×32矩阵 ...

  8. java图像旋转90度_旋转图像90度在java

    使用此方法. /** * Rotates an image. Actually rotates a new copy of the image. * * @param img The image to ...

  9. python中文相似度_python 人脸对比--百度API人脸相似度识别(超简单)-Go语言中文社区...

    说明:这篇是写使用百度人脸识别API进行人脸相似度识别对比,如 给两个人物照片,判断是否是同一个人.简单的4步完成. 1,获取百度人脸识别API的API Key和Secret Key.(10分钟内完成 ...

最新文章

  1. 人工智能 机器学习系列 2:代价函数
  2. matplotlib绘图库入门
  3. Hibernate执行原生SQL
  4. WRF,WPS,WRF-Chem安装及编译步骤及bug总结(1)
  5. (github标星9200+)《南瓜书》:周志华《机器学习》的代码实现
  6. linux WiFi源码解析,Wifi移植浅析
  7. ajax操作的链式写法
  8. 深入浅出学Hive:Hive内建操作符与函数开发
  9. 手动封装element-ui里面的button组件
  10. Spring-Data-Jpa简介
  11. vs 下如何调试js
  12. 4-算法冒泡排序 插入排序
  13. python爬虫网易云音乐最热评论并分析_Python3实现爬虫抓取网易云音乐的热门评论分析(图)...
  14. [WPF系列]Adorner应用-自定义控件ImageHotSpot
  15. yolov5学习率设置
  16. Ubuntu16.04中好用的软件(持续更新)
  17. 基于STM32F103C8T6 HAL库 TM7705数据读取
  18. 日常生活开支记账明细_你的理财小管家!简单明了!皮面理财记账本明细流水支出笔记本!...
  19. 吸入糖皮质激素行业调研报告 - 市场现状分析与发展前景预测
  20. **VIP邮箱哪个品牌最好用?经验分享**

热门文章

  1. 上探式提额与倒逼式提额—风控调额就该这么做
  2. 高保真原型、动画引导、用户登录、巡检任务、维保任务、用户中心、历史记录、帮助中心、清除缓存、任务抽检、扫描二维码、待办事项、账号设置、客服信息、交互说明、手机端、小程序、app原型、BIM信息综合管理
  3. 多密钥ssh-key生成与管理
  4. compser 执行命令提示do not run composer as root/super !
  5. 对于圣杯布局和双飞翼布局的新认识
  6. thinkphp的like用法
  7. 在ORACLE產生001,002的流水號
  8. Eclipse+MyEclipse+Tomcat下配置建立Web Project
  9. liunx trac 插件使用之GanttCalendarPlugin
  10. 个人永久性免费-Excel催化剂插件功能修复与更新汇总篇之七