Python Opencv中用compareHist函数进行直方图比较对比图片
2020-04-11 07:05
639 查看
图像直方图
图像直方图是反映一个图像像素分布的统计表,其实横坐标代表了图像像素的种类,可以是灰度的,也可以是彩色的。纵坐标代表了每一种颜色值在图像中的像素总数或者占所有像素个数的百分比。
图像是由像素构成,因为反映像素分布的直方图往往可以作为图像一个很重要的特征。在实际工程中,图像直方图在特征提取、图像匹配等方面都有很好的应用。
直方图比较
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 opencv实现图片缺陷检测(讲解直方图以及相关系数对比法)
- 使用python opencv对目录下图片进行去重
- python opencv对图像进行旋转且不裁剪图片的实现方法
- Python通过PIL获取图片主要颜色并和颜色库进行对比的方法
- 利用OpenCV通过HSV直方图来进行图片定位
- opencv 矩阵的相似性对比 (图片之间比较)
- 用openCV和Python 实现图片对比,并标识出不同点的方式
- Python+Opencv进行识别相似图片
- opencv2通过比较直方图检索相似图片
- python进行opencv开发----简单的图片操作
- python利用Opencv进行人脸识别(视频流+图片)
- 浅谈Python3识别判断图片主要颜色并和颜色库进行对比的方法
- Python通过PIL获取图片主要颜色并和颜色库进行对比的方法
- 使用Python的PIL模块来进行图片对比
- Python+Opencv进行识别相似图片
- python+opencv显示图片的直方图、高斯滤波、直方图均衡化的结果
- Python+Opencv 图像直方图的基本概念,及使用大津算法进行图像分割的程序实现
- 利用OpenCV感知哈希算法进行图片相似度对比
- opencv 矩阵的相似性对比 (图片之间比较)
- 1 用python进行OpenCV实战之用OpenCV3实现图片载入、显示和储存