Python Opencv中用compareHist函数进行直方图比较对比图片

 更新时间:2020年04月07日 10:11:15   作者:wave.lt  
这篇文章主要介绍了Python Opencv中用compareHist函数进行直方图比较进行对比图片,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

图像直方图

图像直方图是反映一个图像像素分布的统计表,其实横坐标代表了图像像素的种类,可以是灰度的,也可以是彩色的。纵坐标代表了每一种颜色值在图像中的像素总数或者占所有像素个数的百分比。
图像是由像素构成,因为反映像素分布的直方图往往可以作为图像一个很重要的特征。在实际工程中,图像直方图在特征提取、图像匹配等方面都有很好的应用。

直方图比较

1. 图像相似度比较

如果我们有两张图像,并且这两张图像的直方图一样,或者有极高的相似度,那么在一定程度上,我们可以认为这两幅图是一样的,这就是直方图比较的应用之一。

2. 分析图像之间关系

两张图像的直方图反映了该图像像素的分布情况,可以利用图像的直方图,来分析两张图像的关系。

直方图比较函数

cv2.compareHist(H1, H2, method)

其中:

  • H1,H2 分别为要比较图像的直方图
  • method - 比较方式

比较方式(method)

  • 相关性比较 (method=cv.HISTCMP_CORREL) 值越大,相关度越高,最大值为1,最小值为0
  • 卡方比较(method=cv.HISTCMP_CHISQR 值越小,相关度越高,最大值无上界,最小值0
  • 巴氏距离比较(method=cv.HISTCMP_BHATTACHARYYA) 值越小,相关度越高,最大值为1,最小值为0

代码实现

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
def create_rgb_hist(image):
 """"创建 RGB 三通道直方图(直方图矩阵)"""
 h, w, c = image.shape
 # 创建一个(16*16*16,1)的初始矩阵,作为直方图矩阵 
 # 16*16*16的意思为三通道每通道有16个bins
 rgbhist = np.zeros([16 * 16 * 16, 1], np.float32)
 bsize = 256 / 16
 for row in range(h):
  for col in range(w):
   b = image[row, col, 0]
   g = image[row, col, 1]
   r = image[row, col, 2]
   # 人为构建直方图矩阵的索引,该索引是通过每一个像素点的三通道值进行构建
   index = int(b / bsize) * 16 * 16 + int(g / bsize) * 16 + int(r / bsize)
   # 该处形成的矩阵即为直方图矩阵
   rgbhist[int(index), 0] += 1
 plt.ylim([0, 10000])
 plt.grid(color='r', linestyle='--', linewidth=0.5, alpha=0.3)
 return rgbhist
def hist_compare(image1, image2):
 """直方图比较函数"""
 # 创建第一幅图的rgb三通道直方图(直方图矩阵)
 hist1 = create_rgb_hist(image1)
 # 创建第二幅图的rgb三通道直方图(直方图矩阵)
 hist2 = create_rgb_hist(image2)
 # 进行三种方式的直方图比较
 match1 = cv.compareHist(hist1, hist2, cv.HISTCMP_BHATTACHARYYA)
 match2 = cv.compareHist(hist1, hist2, cv.HISTCMP_CORREL)
 match3 = cv.compareHist(hist1, hist2, cv.HISTCMP_CHISQR)
 print("巴氏距离:%s, 相关性:%s, 卡方:%s" %(match1, match2, match3))
src1 = cv.imread("diff1.PNG")
cv.imshow("diff1", src1)
src2 = cv.imread("diff2.PNG")
cv.imshow("diff2", src2)
plt.subplot(1,2,1)
plt.title("diff1")
plt.plot(create_rgb_hist(src1))
plt.subplot(1,2,2)
plt.title("diff2")
plt.plot(create_rgb_hist(src2))
hist_compare(src1, src2)
plt.show()
cv.waitKey(0)
cv.destroyAllWindows()

在这里插入图片描述

在这里插入图片描述

巴氏距离:0.3116175231543461, 相关性:0.8805851455583134,
卡方:154379.82963705878

从计算得到的三个比较值可以发现巴氏距离较低,相关性较高,可以简单认为这两幅图的相似度比较大。

例如下面两幅图

在这里插入图片描述

在这里插入图片描述

巴氏距离:0.8939676325760126, 相关性:0.03202528698270991,
卡方:503948.24201884575

从计算得到的三个比较值可以发现巴氏距离很高,相关性系数很低,可以简单认为这两幅图的相似度非常小。

总结

到此这篇关于Python Opencv中用compareHist函数进行直方图比较进行对比图片的文章就介绍到这了,更多相关python Opencv compareHist函数直方图内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python requests包的request()函数中的参数-params和data的区别介绍

    python requests包的request()函数中的参数-params和data的区别介绍

    这篇文章主要介绍了python requests包的request()函数中的参数-params和data的区别介绍,具有很好参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • python做图片搜索引擎并保存到本地详情

    python做图片搜索引擎并保存到本地详情

    这篇文章主要介绍了python做图片搜索引擎并保存到本地详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-08-08
  • Python实现随机生成一个汉字的方法分享

    Python实现随机生成一个汉字的方法分享

    这篇文章主要为大家详细介绍了Python如何实现随机生成一个汉字的功能,文中的示例代码讲解详细,对我们深入了解Python有一定的帮助,需要的可以参考一下
    2023-01-01
  • PyCharm插件开发实践之PyGetterAndSetter详解

    PyCharm插件开发实践之PyGetterAndSetter详解

    这篇文章主要介绍了PyCharm插件开发实践-PyGetterAndSetter,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-10-10
  • python偏函数partial用法

    python偏函数partial用法

    这篇文章要给大家分享得是python偏函数partial用法,主要介绍什么是偏函数partial、偏函数的作用、偏函数的语法及案例详情,需要的朋友可以参考一下文章得具体详解,希望对你有所帮助
    2021-10-10
  • Python进程间通信Queue实例解析

    Python进程间通信Queue实例解析

    这篇文章主要介绍了Python进程间通信Queue实例解析,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • Python文本终端GUI框架的使用方法

    Python文本终端GUI框架的使用方法

    Python中有几个流行的文本终端GUI框架,它们提供了创建命令行界面的便捷方法,这些框架使开发者能够构建交互式、用户友好的命令行应用程序,本文将介绍几个主要的Python文本终端GUI框架,展示它们的使用方法和示例代码,需要的朋友可以参考下
    2023-12-12
  • python reverse反转部分数组的实例

    python reverse反转部分数组的实例

    今天小编就为大家分享一篇python reverse反转部分数组的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • Python logging日志库空间不足问题解决

    Python logging日志库空间不足问题解决

    这篇文章主要介绍了Python logging日志库空间不足问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • python使用TensorFlow读取和批处理CSV文件

    python使用TensorFlow读取和批处理CSV文件

    本文旨在给大家使用 TensorFlow 库读取 CSV 文件,并将其数据以批次的形式进行处理和展示,通过该实验,我们希望掌握 TensorFlow 中 tf.data.TextLineDataset 的使用方法,以及如何解析 CSV 数据并进行批量处理,需要的朋友可以参考下
    2025-03-03

最新评论