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

using namespace std;
using namespace cv;

Mat img1, img2, img3, img_gray, map_x, map_y;

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

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

int Demo_Histogram();

int index = 0;

//Remap
int Demo_Histogram()
{
  img1 = imread("D://images//1//9.jpg");
  if (img1.empty())
  {
    cout << "could not load image..." << endl;
    return 0;
  }
  imshow(win1, img1);

  vector<Mat> bgr_planes;

  //把多通道图像分为多个单通道图像
  split(img1,bgr_planes);
  //imshow(win2,bgr_planes);
  int histSize = 256;
  float range[] = {0,256};

  const float *histRanges = {range};
  Mat b_hist, g_hist, r_hist;
  calcHist(&bgr_planes[0], 1, 0, Mat(), b_hist, 1, &histSize, &histRanges, true, false);
  calcHist(&bgr_planes[1], 1, 0, Mat(), g_hist, 1, &histSize, &histRanges, true, false);
  calcHist(&bgr_planes[2], 1, 0, Mat(), r_hist, 1, &histSize, &histRanges, true, false);

  int hist_h = 400;
  int hist_w = 512;
  int bin_w = hist_w / histSize;
  Mat histImage(hist_w,hist_h,CV_8UC3,Scalar(0,0,0));

  //归一化处理
  normalize(b_hist, b_hist, 0, hist_h, NORM_MINMAX, -1, Mat());
  normalize(g_hist, g_hist, 0, hist_h, NORM_MINMAX, -1, Mat());
  normalize(r_hist, r_hist, 0, hist_h, NORM_MINMAX, -1, Mat());

  for (int i=1;i<histSize;i++)
  {
    line(histImage,
      Point((i-1)*bin_w,hist_h-cvRound(b_hist.at<float>(i-1))),
      Point((i)*bin_w, hist_h - cvRound(b_hist.at<float>(i))),
      Scalar(255,0,2),2,LINE_AA);

    line(histImage,
      Point((i - 1)*bin_w, hist_h - cvRound(g_hist.at<float>(i - 1))),
      Point((i)*bin_w, hist_h - cvRound(g_hist.at<float>(i))),
      Scalar(0, 255, 2), 2, LINE_AA);

    line(histImage,
      Point((i - 1)*bin_w, hist_h - cvRound(r_hist.at<float>(i - 1))),
      Point((i)*bin_w, hist_h - cvRound(r_hist.at<float>(i))),
      Scalar(0, 0, 255), 2, LINE_AA);
  }

  imshow(win2, histImage);
  return 0;
}

int main()
{
  Demo_Histogram();

  waitKey(0);
  return 0;
}

Opencv 图片直方图的更多相关文章

  1. 【计算机视觉】OpenCV中直方图处理函数简述

    计算直方图calcHist 直方图是对数据集合的统计 ,并将统计结果分布于一系列提前定义的bins中.这里的数据不只指的是灰度值 ,统计数据可能是不论什么能有效描写叙述图像的特征. 如果有一个矩阵包括 ...

  2. opencv——图像直方图与反向投影

    引言 在图像处理中,对于直方图这个概念,肯定不会陌生.但是其原理真的可以信手拈来吗? 本文篇幅有点长,在此列个目录,大家可以跳着看: 分析图像直方图的概念,以及opencv函数calcHist()对于 ...

  3. 基于opencv图片切割

    基于opencv图片切割为n个3*3区块 工作原因,切割图片,任务急,暂留调通的源码,留以后用. package com.rosetta.image.test; import org.opencv.c ...

  4. Opencv图片明暗处理

    Opencv图片明暗处理 #include <iostream> #include <opencv2/opencv.hpp> using namespace std; usin ...

  5. Python OpenCV图片转视频 工具贴(三)

    Python OpenCV图片转视频 粘贴即用,注意使用时最好把自己的文件按照数字顺序命名.按照引导输入操作. # 一键傻瓜式引导图片串成视频 # 注意使用前最好把文件命名为数字顺序格式 import ...

  6. python opencv 图片缺陷检测(讲解直方图以及相关系数对比法)

    一.利用直方图的方式进行批量的图片缺陷检测(方法简单) 二.步骤(完整代码见最后) 2.1灰度转换(将原图和要检测对比的图分开灰度化) 灰度化的作用是因为后面的直方图比较需要以像素256为基准进行相关 ...

  7. opencv图像直方图均衡化及其原理

    直方图均衡化是什么有什么用 先说什么是直方图均衡化,通俗的说,以灰度图为例,原图的某一个像素为x,经过某个函数变为y.形成新的图.新的图的灰度值的分布是均匀的,这个过程就叫直方图均衡化. 图像直方图均 ...

  8. opencv —— equalizeHist 直方图均衡化实现对比度增强

    直方图均匀化简介 从这张未经处理的灰度图可以看出,其灰度集中在非常小的一个范围内.这就导致了图片的强弱对比不强烈. 直方图均衡化的目的,就是把原始的直方图变换为在整个灰度范围(0~255)内均匀分布的 ...

  9. opencv 比较直方图方式 进行人脸检测对比

    完整opencv(emgucv)人脸.检测.采集.识别.匹配.对比 //成对几何直方图匹配               public static string MatchHist()         ...

随机推荐

  1. springboot各种集成

    fastjson 两个方法 @Configuration public class WebMvcConfigurer extends WebMvcConfigurerAdapter { @Overri ...

  2. bzoj 4816 [Sdoi2017]数字表格——反演

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4816 \( ans=\prod\limits_{d=1}^{n}f[d]^{\sum\lim ...

  3. sklearn中的predict与predict_proba的区别(得到各条记录每个标签的概率(支持度))

    假定在一个k分类问题中,测试集中共有n个样本.则: predict返回的是一个大小为n的一维数组,一维数组中的第i个值为模型预测第i个预测样本的标签: predict_proba返回的是一个n行k列的 ...

  4. POJ 2549 Sumsets(折半枚举+二分)

    Sumsets Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11946   Accepted: 3299 Descript ...

  5. AD域中客户端时间与服务器同步

    1.域控配置 修改注册表,设置域控服务器名称 设置组策略,启动NTP服务器 域策略中设置windows time服务自动启动 2.客户端 更新域策略gpupdate /force 如果不重启的话,先n ...

  6. angular的继承作用域通信

    本人学了一段时间的angular,angular之间怎样通信,我就总结以下几点,如果有哪位大神认为不对,敬请赐教. 1.父子之间的作用域进行通信 html <div ng-controller= ...

  7. 第十章 Secret & Configmap(下)

    10.4 ConfigMap Secret可以为Pod提供密码.Token.私钥等敏感数据:对于一些非敏感数据,比如一些配置信息,则可以用ConfigMap. configMap的使用方式与Secre ...

  8. Easyui combotree 获取自定义ID属性方法

    1.设置属性 <input id="cc" class="easyui-combotree" data-options="url:'tree_d ...

  9. 【BZOJ】2160: 拉拉队排练(Manacher)

    题目 2160: 拉拉队排练 Description 艾利斯顿商学院篮球队要参加一年一度的市篮球比赛了.拉拉队是篮球比赛的一个看点,好的拉拉队往往能帮助球队增加士气,赢得最终的比赛.所以作为拉拉队队长 ...

  10. java类继承总结一 父类类型与子类类型之间的转化问题(转)

    java类继承总结一 父类类型与子类类型之间的转化问题 本文将通过一个实例描述父类类型与子类类型之间的转化问题,这个很特殊的问题常常会导致一些潜在的危险,让你整整一个晚上都在调试程序以解决一个让人抓狂 ...