opencv笔记二十六(比较两幅图的【直方图的】相似度)compareHist(InputArray h1, InputArray H2,  int method//CV_COMP_BHATTACH)

 

直方图比较方法-相关性计算(CV_COMP_CORREL)

d=1:两幅图完全一致

d越接近1两幅图越相似

 

直方图比较方法-卡方计算(CV_COMP_CHISQR)

d=0:两幅图完全相同

d越小两幅图越相同

 

直方图比较方法-十字计算(CV_COMP_INTERSECT)【不常用,很不准】

 

直方图比较方法-巴氏距离计算(CV_COMP_BHATTACHARYYA )【比较精确】

d=0:完全相等

d越接近0两幅图越相似

 

实验步骤:

1,首先把图像从RGB色彩空间转换到HSV色彩空间cvtColor

2,计算图像的直方图,然后归一化到[0~1]之间calcHist和normalize;

3,使用上述四种比较方法之一进行比较compareHist

 

API:

compareHist(//比较直方图相似度

InputArray h1, // 直方图数据,下同

InputArray H2, 

int method// 比较方法,上述四种方法之一 )

 

代码如下:

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace std;
using namespace cv;
int main(int argc, char** argv) {
Mat t1,t2,t3,t1h,t2h,t3h;
t1 = imread("1.bmp");
if (!t1.data) {
printf("could not load image...\n");
return -1;
}
t2 = imread("2.bmp");
t3 = imread("5.bmp");
pyrUp(t1, t1, Size(t1.cols * 2, t1.rows * 2));
pyrUp(t1, t1, Size(t1.cols * 2, t1.rows * 2));
pyrUp(t2, t2, Size(t2.cols * 2, t2.rows * 2));
pyrUp(t2, t2, Size(t2.cols * 2, t2.rows * 2));
pyrUp(t3, t3, Size(t3.cols * 2, t3.rows * 2));
pyrUp(t3, t3, Size(t3.cols * 2, t3.rows * 2));
cvtColor(t1, t1h, CV_BGR2HSV);
cvtColor(t2, t2h, CV_BGR2HSV);
cvtColor(t3, t3h, CV_BGR2HSV);
int t10 = 32, t20 = 64;
int t11[] = { t10,t20 };
int channel[] = { 0,1 };
float f1[] = { 0,180 };
float f2[] = { 0,256 };
const float *f3[] = { f1,f2 };
Mat t1c, t2c, t3c;


calcHist(&t1h,1, channel, Mat(), t1c, 2, t11, f3, true, false);
normalize(t1c, t1c, 0, 1,NORM_MINMAX, -1);
calcHist(&t2h, 1, channel, Mat(), t2c, 2, t11, f3, true, false);
normalize(t2c, t2c, 0, 1, NORM_MINMAX, -1);
calcHist(&t3h, 1, channel, Mat(), t3c, 2, t11, f3, true, false);
normalize(t3c, t3c, 0, 1, NORM_MINMAX, -1);


double t12 = compareHist(t1c, t2c,CV_COMP_BHATTACHARYYA);
double t13 = compareHist(t1c, t3c, CV_COMP_BHATTACHARYYA);
double t110 = compareHist(t1c, t1c, CV_COMP_BHATTACHARYYA);
cout << "t12=" << t12 << " t13=" << t13 << " t11=" << t110;
namedWindow("M", 0);
waitKey(0);
return 0;
}

 

 

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个错误是由于比较的两个直方图的类型或深度不一致导致的。在使用 OpenCVcompareHist 函数时,需要注意比较的两个直方图必须具有相同的类型和深度。 你可以先检查一下两个直方图的类型和深度是否一致,如果不一致的话需要进行相应的转换。例如,如果两个直方图的类型不一致,可以使用 cv::cvtColor 函数将其中一个直方图转换为另一个直方图的类型。如果两个直方图的深度不一致,可以使用 cv::convertScaleAbs 函数将其中一个直方图的深度转换为另一个直方图的深度。 以下是一些示例代码: ```python import cv2 as cv # 读取两个像并转换为灰度像 img1 = cv.imread('image1.jpg') img2 = cv.imread('image2.jpg') gray1 = cv.cvtColor(img1, cv.COLOR_BGR2GRAY) gray2 = cv.cvtColor(img2, cv.COLOR_BGR2GRAY) # 计算两个灰度像的直方图 hist1 = cv.calcHist([gray1], [0], None, [256], [0, 256]) hist2 = cv.calcHist([gray2], [0], None, [256], [0, 256]) # 转换直方图的类型和深度 hist1 = cv.convertScaleAbs(hist1, cv.CV_32F) hist2 = cv.convertScaleAbs(hist2, cv.CV_32F) # 比较直方图 result = cv.compareHist(hist1, hist2, cv.HISTCMP_CORREL) print(result) ``` 在这个示例代码中,我们首先读取了两个像并将它们转换为灰度像。然后计算了两个灰度像的直方图,并将它们转换为相同的类型和深度。最后使用 compareHist 函数比较了两个直方图相似度

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值