opencv图片比较大法

简介: opencv图片比较大法
  • 本程序做什么?
  • 加载基准图像和另一张做对比
  • 将图像转换到HSV格式。
  • 计算所有图像的H-S直方图,并归一化以便对比。
  • 图像直方图作对比。
  • 显示计算所得的直方图相似度数值。
void CompareHist()
{
    imshow("input1", image);
    imshow("input2", temp);
    Mat hsv1, hsv2;
    cvtColor(image, hsv1, COLOR_BGR2HSV);
    cvtColor(temp, hsv2, COLOR_BGR2HSV);
    int h_bins = 60; int s_bins = 64;
    int histSize[] = { h_bins, s_bins };
    float h_ranges[] = { 0, 180 };
    float s_ranges[] = { 0, 256 };
    const float* ranges[] = { h_ranges, s_ranges };
    int channels[] = { 0, 1 };
    Mat hist1, hist2;
    calcHist(&hsv1, 1, channels, Mat(), hist1, 2, histSize, ranges, true, false);
    calcHist(&hsv2, 1, channels, Mat(), hist2, 2, histSize, ranges, true, false);
    normalize(hist1, hist1, 0, 1, NORM_MINMAX, -1, Mat());
    normalize(hist2, hist2, 0, 1, NORM_MINMAX, -1, Mat());
    //4 种比较方法
    for (int i = 0; i < 4; i++)
    {
        int compare_method = i;
        double src1_src2 = compareHist(hist1, hist2, compare_method);
        qDebug() << " Method" << i << ": src1_src2:" << src1_src2;
        printf(" Method [%d]  : src1_src2 : %f \n", i, src1_src2);
    }
    waitKey(0);
}
void calcHist(const Mat * images, 
                int nimages, 
                const int* channels, 
                InputArray mask, 
                OutputArray hist, 
                int dims, 
                const int* histSize,
                const float** ranges,
                bool uniform = true, 
                bool accumulate = false);

images:输入的图像的指针;

nimages:输入图像个数;

channels:需要统计直方图的第几通道;

mask:掩模,mask必须是一个8位(CV_8U)的数组并且和images的数组大小相同;

hist:直方图计算的输出值;

dims:输出直方图的维度(由channels指定);

histSize:直方图中每个dims维度需要分成多少个区间(如果把直方图看作一个一个竖条的话,就是竖条的个数);

ranges:统计像素值的区间;

uniform = true:是否对得到的直方图数组进行归一化处理;

accumulate = false:在多个图像时,是否累积计算像素值的个数;

方法1:Correlation ( CV_COMP_CORREL )

相关性比较,取值范围[0,1],越接近1,直方图相似度越高

方法2:Chi-Square ( CV_COMP_CHISQR )

卡方检验,取值范围[0,1],越接近0,直方图相似度越高

方法3:Intersection ( method=CV_COMP_INTERSECT )

相交,取值高,直方图相似度越高

方法4:Bhattacharyya distance ( CV_COMP_BHATTACHARYYA )

巴氏距离在直方图比较中效果最佳,完全匹配为1,完全不匹配为0

相关文章
|
1月前
|
计算机视觉
Opencv学习笔记(十二):图片腐蚀和膨胀操作
这篇文章介绍了图像腐蚀和膨胀的原理、作用以及使用OpenCV实现这些操作的代码示例,并深入解析了开运算和闭运算的概念及其在图像形态学处理中的应用。
109 1
Opencv学习笔记(十二):图片腐蚀和膨胀操作
|
1月前
|
计算机视觉 Python
Opencv学习笔记(二):如何将整个文件下的彩色图片全部转换为灰度图
使用OpenCV库将一个文件夹内的所有彩色图片批量转换为灰度图,并提供了相应的Python代码示例。
31 0
Opencv学习笔记(二):如何将整个文件下的彩色图片全部转换为灰度图
|
1月前
|
计算机视觉 Python
Opencv学习笔记(一):如何将得到的图片保存在指定目录以及如何将文件夹里所有图片以数组形式输出
这篇博客介绍了如何使用OpenCV库在Python中将图片保存到指定目录,以及如何将文件夹中的所有图片读取并以数组形式输出。
137 0
Opencv学习笔记(一):如何将得到的图片保存在指定目录以及如何将文件夹里所有图片以数组形式输出
|
6月前
|
监控 API 计算机视觉
OpenCV这么简单为啥不学——1.13图片冷白皮(美白)处理
OpenCV这么简单为啥不学——1.13图片冷白皮(美白)处理
69 0
|
6月前
|
存储 编解码 监控
OpenCV这么简单为啥不学——2.1、imwrite逐帧保存图片
OpenCV这么简单为啥不学——2.1、imwrite逐帧保存图片
120 0
|
6月前
|
人工智能 Linux API
OpenCV这么简单为啥不学——1.1、图像处理(灰度图、模糊图片、GaussianBlur函数、提取边缘、边缘膨胀、边缘细化)
OpenCV这么简单为啥不学——1.1、图像处理(灰度图、模糊图片、GaussianBlur函数、提取边缘、边缘膨胀、边缘细化)
103 0
|
1月前
|
计算机视觉
Opencv错误笔记(一):通过cv2保存图片采用中文命名出现乱码
在使用OpenCV的cv2模块保存带有中文命名的图片时,直接使用cv2.imwrite()会导致乱码问题,可以通过改用cv2.imencode()方法来解决。
128 0
Opencv错误笔记(一):通过cv2保存图片采用中文命名出现乱码
|
3月前
|
计算机视觉 Windows Python
windows下使用python + opencv读取含有中文路径的图片 和 把图片数据保存到含有中文的路径下
在Windows系统中,直接使用`cv2.imread()`和`cv2.imwrite()`处理含中文路径的图像文件时会遇到问题。读取时会返回空数据,保存时则无法正确保存至目标目录。为解决这些问题,可以使用`cv2.imdecode()`结合`np.fromfile()`来读取图像,并使用`cv2.imencode()`结合`tofile()`方法来保存图像至含中文的路径。这种方法有效避免了路径编码问题,确保图像处理流程顺畅进行。
331 1
|
1月前
|
Serverless 计算机视觉
语义分割笔记(三):通过opencv对mask图片来画分割对象的外接椭圆
这篇文章介绍了如何使用OpenCV库通过mask图像绘制分割对象的外接椭圆。首先,需要加载mask图像,然后使用`cv2.findContours()`寻找轮廓,接着用`cv2.fitEllipse()`拟合外接椭圆,最后用`cv2.ellipse()`绘制椭圆。文章提供了详细的代码示例,展示了从读取图像到显示结果的完整过程。
48 0
语义分割笔记(三):通过opencv对mask图片来画分割对象的外接椭圆
|
3月前
|
存储 编解码 API
python多种方法压缩图片,opencv、PIL、tinypng、pngquant压缩图片
python多种方法压缩图片,opencv、PIL、tinypng、pngquant压缩图片
248 1