#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

Mat img1, img2, img3, img_result, img_gray1, img_gray2, img_gray3, img_hsv1,img_hsv2,img_hsv3;
MatND img_hist1,img_hist2,img_hist3;

char win1[] = "window1";
char win2[] = "window2";
char win3[] = "window3";
char win4[] = "window4";
char win5[] = "window5";

int threshold_value = 0;
int max_value = 255;
RNG rng(12345);

int Demo_Histogram_Compare();
string convertToString(double d);

int index = 0;

//Remap
int Demo_Histogram_Compare()
{
  img1 = imread("D://images//lion-1.jpg");
  img2 = imread("D://images//lion-4.jpg");
  img3 = imread("D://images//lion-5.jpg");
  if (img1.empty())
  {
    cout << "could not load image..." << endl;
    return 0;
  }
  //imshow(win1, img1);

  cvtColor(img1,img_hsv1,CV_BGR2HSV);
  cvtColor(img2, img_hsv2, CV_BGR2HSV);
  cvtColor(img3, img_hsv3, CV_BGR2HSV);

  int h_bins = 10;
  int s_bins = 12;
  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};

  calcHist(&img_hsv1, 1, channels, Mat(), img_hist1, 2, histSize, ranges, true, false);
  normalize(img_hist1, img_hist1, 0, 1, NORM_MINMAX, -1, Mat());

  calcHist(&img_hsv2, 1, channels, Mat(), img_hist2, 2, histSize, ranges, true, false);
  normalize(img_hist2, img_hist2, 0, 1, NORM_MINMAX, -1, Mat());

  calcHist(&img_hsv3, 1, channels, Mat(), img_hist3, 2, histSize, ranges, true, false);
  normalize(img_hist3, img_hist3, 0, 1, NORM_MINMAX, -1, Mat());

  double img_1_c_1 = compareHist(img_hist1, img_hist1, CV_COMP_INTERSECT);
  double img_1_c_2 = compareHist(img_hist1, img_hist2, CV_COMP_INTERSECT);
  double img_1_c_3 = compareHist(img_hist1, img_hist3, CV_COMP_INTERSECT);
  double img_2_c_3 = compareHist(img_hist2, img_hist3, CV_COMP_INTERSECT);

  img2.copyTo(img_result);
  putText(img1, convertToString(img_1_c_1), Point(50, 50), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255), 2, LINE_AA);
  putText(img2, convertToString(img_1_c_2), Point(50, 50), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255), 2, LINE_AA);
  putText(img3, convertToString(img_1_c_3), Point(50, 50), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255), 2, LINE_AA);
  putText(img_result, convertToString(img_2_c_3), Point(50, 50), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255), 2, LINE_AA);

  imshow(win1,img1);
  imshow(win2,img2);
  imshow(win3,img3);
  imshow(win4, img_result);
  return 0;
}

string convertToString(double d)
{
  ostringstream os;
  if (os<<d)
  {
    return os.str();
  }
  return "Invalid conversion...";
}

int main()
{
  Demo_Histogram_Compare();

  waitKey(0);
  return 0;
}

Opencv 直方图比较的更多相关文章

  1. openCV 直方图统计

    直方图显示 #include <opencv2/opencv.hpp> using namespace std; using namespace cv; int main(int argc ...

  2. OPENCV直方图与匹配

    直方图可以用来描述不同的参数和事物,如物体的色彩分布,物体的边缘梯度模版以及目标位置的当前假设的概率分布. 直方图就是对数据进行统计的一种方法,并且将统计值定义到一系列定义好的bin(组距)中,获得一 ...

  3. OpenCV——直方图均衡化(用于图像增强)

    #include <opencv2/opencv.hpp> #include <iostream> #include <math.h> using namespac ...

  4. opencv:直方图操作

    示例程序: #include <opencv.hpp> using namespace cv; using namespace std; int main() { Mat src, dst ...

  5. opencv直方图该怎么画

    图像直方图是反映图像中像素分布特性的统计表,一般显示如下: 其中横坐标代表的是图像像素的种类,或者说是灰度级,纵坐标代表的是每一级灰度下像素数或者该灰度级下像素数在所有图像总像素数总所占的百分比. 直 ...

  6. OpenCV直方图(直方图、直方图均衡,直方图匹配,原理、实现)

    1 直方图 灰度级范围为 \([0,L-1]\) 的数字图像的直方图是离散函数 \(h(r_k) = n_k\) , 其中 \(r_k\) 是第\(k\)级灰度值,\(n_k\) 是图像中灰度为 \( ...

  7. opencv 直方图

    1.简介 对输入图像进行直方图均衡化处理,提升后续对象检测的准确率在OpenCV人脸检测的代码演示中已经很常见.此外对医学影像图像与卫星遥感图像也经常通过直方图均衡化来提升图像质量. 图像直方图均衡化 ...

  8. opencv直方图均衡化

    #include <iostream> #include "highgui.h" #include "cv.h" #include "cx ...

  9. opencv直方图拉伸

    1.首先计算出一幅图像的直方图 //计算直方图 cv::MatND ImageHist::getHist(const cv::Mat &image){ cv::Mat im; if(image ...

随机推荐

  1. jsp_include

    jsp__include指令先包含后编译 include 行为 先编译后包含 <jsp:include page="head.jsp"></jsp:include ...

  2. Java API 操作Zookeeper

    一.依赖 <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookee ...

  3. 优化RequireJS项目(合并与压缩)

    关于RequireJS已经有很多文章介绍过了.这个工具可以将你的JavaScript代码轻易的分割成苦 干个模块(module)并且保持你的代码模块化与易维护性.这样,你将获得一些具有互相依赖关系的J ...

  4. ssi框架学习总结

    框架简介: 相信大家对于mvc的三层架构已经灰常熟悉了,在这就不细讲了,个人感觉ssi的框架结构还是比较典型的mvc三层架构,还是比较容易上手的.关于这块的入门我想特别感谢下FrankHui童鞋,在他 ...

  5. Java编程打印出1000以内所有的完数

    /*如果一个数等 于其所有因子之和,我们就称这个数为"完数" * 例如6的因子为1,2,3, 6=1+2+3, 6就是一一个完数. * 请编程打印出1000以内所有的完数*/ pu ...

  6. iis 重新安装后 重新注册asp.net

    服务器IIS问题: 卸载并重新安装了IIS.... 解决方法:原因是IIS重装后要重新安装一下.NET Framework. 开始-->运行-->CMD-->然后在CMD窗口中输入命 ...

  7. js手机号正则表达式验证

    var phone = $("#phone").val(); //陈旧版 var parphone = /^(((13[0-9]{1})|(17[0-9]{1})|(15[0-9] ...

  8. UUID是如何保证全局唯一的

    UUID由以下几部分的组合: (1)当前日期和时间,UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同.         据说时间粒度很 ...

  9. 【洛谷】P1379 八数码难题(bfs)

    题目 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初始状态)和目标布局 ...

  10. linux下安装mysql后 sql区分大小写

    Linux下的MySQL默认是区分表名大小写的,通过如下设置,可以让MySQL不区分表名大小写:1.用root登录,修改 /etc/my.cnf:2.在[mysqld]节点下,加入一行: lower_ ...