利用OpenCV的函数compareHist()对图像的直方图进行相似性比较
Opencv 函数 利用 进行 比较 图像 直方图 相似性
2023-09-11 14:15:39 时间
图像的直方图表示图像的灰度值统计特性,有时可以通过比较两幅图像的直方图来衡量两幅图像的相似程度。
虽然两幅图像的直方图分布相似不代表两幅图像相似,但两幅图像相似,则两幅图像的的直方图分布一定相似。例如,通过插值对图像进行缩放后,图像的直方图虽然不会与之前完全一致,但是两者之间一定具有很高的相似性,因而可以通过比较两幅图像的直方图分布的相似性对图像进行初步的筛选与识别。
OpenCV提供了用于比较两幅图像直方图相似性的函数compareHist()。
函数compareHist()的原型如下:
double cv::compareHist(InputArray H1,
InputArray H2,
int method )
retval=cv.compareHist(H1, H2, method)
从上面的原型可以看出,函数compareHist的使用是很简单的,关键在于知道参数method有哪些可选的比较方法。
参数method的各个取值及代表的意义见下表所示:
当method取HISTCMP_CORREL时,如果两幅图像的直方图完全一致,则计算值为1;如果两幅图像的直方图完全不相关,则计算值为0。
当method取HISTCMP_CHISQR 时,如果两幅图像的直方图完全一致,则计算值为0;两幅图像的相似性越低,计算值越大。
当method取HISTCMP_INTERSECT时,数值越大,相似性越高;数值越小,相似性越低。
当method取HISTCMP_BHATTACHARYYA 时,如果两幅图像的直方图完全一致,则计算值为0;两幅图像的相似性越低,计算值越大。
当method取HISTCMP_CHISQR_ALT 时,如果两幅图像的直方图完全一致,则计算值为0;两幅图像的相似性越低,计算值越大。
当method取HISTCMP_KL_DIV 时,如果两幅图像的直方图完全一致,则计算值为0;两幅图像的相似性越低,计算值越大。
Python示例代码如下:
# -*- coding: utf-8 -*-
# 出处:昊虹AI笔记网(hhai.cc)
# 用心记录计算机视觉和AI技术
# OpenCV的版本为4.4.0
import cv2 as cv
import math
import sys
if __name__ == '__main__':
# 读取图像并判断是否读取成功
img1 = cv.imread('E:/material/images/2023/2023-01/hand1.jpg', 0)
img2 = cv.imread('E:/material/images/2023/2023-01/hand2.jpg', 0)
img3 = cv.imread('E:/material/images/2023/2023-01/circle.jpg', 0)
if img1 is None:
print('Failed to read img1.')
sys.exit()
if img2 is None:
print('Failed to read img2.')
sys.exit()
if img3 is None:
print('Failed to read img3.')
sys.exit()
cv.imshow('img1', img1)
cv.imshow('img2', img2)
cv.imshow('img3', img3)
# 计算图像直方图
img1_hist = cv.calcHist([img1], [0], None, [255], [0, 256])
img2_hist = cv.calcHist([img2], [0], None, [255], [0, 256])
img3_hist = cv.calcHist([img3], [0], None, [255], [0, 256])
# 进行直方图比较
result1 = cv.compareHist(img1_hist, img1_hist, method=cv.HISTCMP_CORREL)
result2 = cv.compareHist(img1_hist, img2_hist, method=cv.HISTCMP_CORREL)
result3 = cv.compareHist(img1_hist, img3_hist, method=cv.HISTCMP_CORREL)
# 对比图结果进行近似值处理
round_result1 = round(abs(result1), 2)
round_result2 = round(abs(result2), 2)
round_result3 = round(abs(result3), 2)
cv.waitKey(0)
cv.destroyAllWindows()
运行结果如下:
C++代码略。
相关文章
- OpenCV2学习笔记(十五):利用Cmake高速查找OpenCV函数源代码
- 用实际例子详细探究OpenCV的轮廓检测函数findContours(),彻底搞清每个参数、每种模式的真正作用与含义
- OpenCV函数汇总(所有函数)---219个函数
- 利用OpenCV的霍夫变换线检测函数HoughLines()得到直线的ρ和θ值后绘制直线的原理详解
- 利用OpenCV的函数matchTemplate()实现在图像中寻找、检索、搜索模板图像【图像模板匹配】
- 利用OpenCV的函数calcHist()计算出图像的直方图数据后绘制图像的直方图
- 详解OpenCV的线段绘制函数line()
- 利用OpenCV的函数LUT()对矩阵的数据进行查表映射
- 利用OpenCV的函数imwrite()保存图像到硬盘
- 详解OpenCV的函数imread()和函数imshow(),并利用它们实现对图像的读取和显示
- 理解OpenCV中的宏定义 CVAPI(函数返回类型)
- 利用OpenCV的函数cvtcolor()进行颜色空间转换时需要注意的地方
- 利用OpenCV的函数warpAffine()做图像的仿射变换【实现图像的平移、缩放、旋转、翻转等操作】
- 利用OpenCV的函数inpaint()实现图像的污点修复
- 利用OpenCV窗口鼠标事件设置函数setMouseCallback()实现显示当前鼠标坐标、截取指定区域图像等功能;并附函数putText()、circle()、rectangle()的介绍
- 利用OpenCV的函数threshold()对图像作基于OTSU的二值阈值化处理-并附比较好的介绍OTSU原理的博文链接
- 详解OpenCV的函数adaptiveThreshold(),并利用它实现图像的自适应二值化阈值分割
- 利用OpenCV的函数threshold()实现双阈值二值化操作的C++代码
- 利用霍夫梯度法进行圆检测的原理概要及利用OpenCV的函数HoughCircles()实现霍夫梯度法圆检测的代码
- 利用OpenCV的Grabcut()函数实现图像的前景与背景的分割-并对Grabcut()作详细介绍
- Python-OpenCV 图像叠加加权实现
- 基于ASP.NET OpenCV+ SQL Server 实现(Web)车牌识别系统【100010561】