一、概述

二、一维灰度直方图

 #include "opencv2/opencv.hpp"
#include<iostream>
using namespace cv;
using namespace std; void main()
{
Mat img = imread("E://0.jpg", ); //以灰度方式打开,灰度图和彩色图直方图结果不同
imshow("src", img); Mat dstHist; //定义存储直方图变量
int dims = ; //需要统计的特征数目(只统计灰度值)
float hranges[] = {, }; //范围[0,256),注意是最大值加1
const float* ranges[] = {hranges};
int bins = ;//组距:简单理解为直方图分为几个柱子
int channels = ;
//计算直方图
calcHist(&img, , &channels, Mat(), dstHist, dims, &bins, ranges); int scale = ;
Mat dstImg(bins * scale, bins*, CV_8UC3, Scalar()); //定义直方图输出图像,长×宽
double minValue = ;
double maxValue = ;
minMaxLoc(dstHist, &minValue, &maxValue);//统计直方图dstHist的最小最大值,并返回该值位置
int hpt = saturate_cast<int>(0.9*bins); //设置最大值并防止溢出
int j=;
//绘制直方图
for(int i=; i<; i++)
{
float binValue = dstHist.at<float>(i);
//if(i>250)
cout<<"i="<<i<<"---Value="<<binValue<<endl;
int realValue = saturate_cast<int>(binValue*hpt/maxValue); //归一化数据
//cout<<"i="<<i<<"---Value="<<realValue<<endl;
line(dstImg, Point(i*scale, bins-), Point(i*scale, bins-realValue), Scalar(, , ), , );//左上角和右下角坐标,坐标系如下图所示
//rectangle(dstImg, Point(i*scale, bins-1), Point(i*scale+1, bins-realValue), Scalar(0, 255, 0), 1);
//rectangle(dstImg, Point(j*scale, bins-1), Point(j*scale+1, bins-realValue), Scalar(rand()%255, rand()%255, rand()%255), -1);
//rectangle(dstImg, Point(j*scale, bins-1), Point(j*scale+1, bins-realValue), Scalar(rand()%255, rand()%255, rand()%255), -1);
//j=j+3;
}
imshow("Histogram", dstImg);
waitKey();
destroyAllWindows();
}

第35行代码的坐标为Point(i*scale, bins-1), Point(i*scale, bins-realValue)的原因。

如果觉得直方图太密集了,可以调整宽度

三、不均匀灰度直方图

 #include "opencv2/opencv.hpp"
#include<iostream>
using namespace cv;
using namespace std; void main()
{
Mat img = imread("E://0.jpg",);
imshow("src", img); Mat dstHist;
int channels = ;
int histSize[]={};
float hranges[]={,,,,,};
const float* ranges[]={hranges};
int size=;
//计算直方图
calcHist(&img,,&channels,Mat(),dstHist,,histSize,ranges,false); int scale=;
Mat dstImg(size*scale,size,CV_8UC3,Scalar());
double minValue=;
double maxValue=;
minMaxLoc(dstHist,&minValue,&maxValue,,);
int hpt=saturate_cast<int>(0.9*size);//设置最大值并防止溢出
int j=;
for (int i = ; i < ; i++)
{
float binValue=dstHist.at<float>(i);
cout<<"i="<<i<<"---Value="<<binValue<<endl;
int realValue=saturate_cast<int>(binValue*hpt/maxValue);
rectangle(dstImg,Point(j*scale,size-),Point((j+)*scale-,size-realValue),Scalar(, , ), -);
j+=;
} imshow("Histogram", dstImg);
waitKey();
destroyAllWindows(); }

四、RGB三色直方图

 #include "opencv2/opencv.hpp"
using namespace cv; void main()
{
Mat src=imread("E://0.jpg");
int bins = ;
int hist_size[] = {bins};
float range[] = { , };
const float* ranges[] = { range};
Mat hist_r,hist_g,hist_b; int channels_r[] = {};
calcHist( &src, , channels_r, Mat(), // do not use mask
hist_r, , hist_size, ranges,
true, // the histogram is uniform
false ); int channels_g[] = {};
calcHist( &src, , channels_g, Mat(),hist_g, , hist_size, ranges,true,false);
int channels_b[] = {};
calcHist( &src, , channels_b, Mat(),hist_b, , hist_size, ranges,true,false); double max_val_r,max_val_g,max_val_b;
minMaxLoc(hist_r, , &max_val_r, , );
minMaxLoc(hist_g, , &max_val_g, , );
minMaxLoc(hist_b, , &max_val_b, , );
int scale = ;
int hist_height=;
Mat hist_img = Mat::zeros(hist_height, bins*+, CV_8UC3);
for(int i=;i<bins;i++)
{
float bin_val_r = hist_r.at<float>(i);
float bin_val_g = hist_g.at<float>(i);
float bin_val_b = hist_b.at<float>(i);
int intensity_r = cvRound(bin_val_r*hist_height/max_val_r); //要绘制的高度
int intensity_g = cvRound(bin_val_g*hist_height/max_val_g); //要绘制的高度
int intensity_b = cvRound(bin_val_b*hist_height/max_val_b); //要绘制的高度
rectangle(hist_img,Point(i*scale,hist_height-),
Point((i+)*scale - , hist_height - intensity_r),
CV_RGB(,,)); rectangle(hist_img,Point((i+bins)*scale,hist_height-),
Point((i+bins+)*scale - , hist_height - intensity_g),
CV_RGB(,,)); rectangle(hist_img,Point((i+bins*)*scale,hist_height-),
Point((i+bins*+)*scale - , hist_height - intensity_b),
CV_RGB(,,)); }
imshow( "src", src );
imshow( "RGB Histogram", hist_img ); waitKey();
destroyAllWindows(); }

五、二维直方图

 #include "opencv2/opencv.hpp"
using namespace cv; void main()
{
Mat src=imread("E://0.jpg");
Mat hsv;
int Bbins = , Gbins = ;
int histSize[] = {Bbins, Gbins};
float hranges[] = { , };
float sranges[] = { , };
const float* ranges[] = { hranges, sranges };
Mat hist; int channels[] = {, };
calcHist( &src, , channels, Mat(), hist, , histSize, ranges);
double maxVal=;
minMaxLoc(hist, , &maxVal, , );
int scale = ;
Mat histImg = Mat::zeros(Bbins*(scale), Bbins*(scale), CV_8UC3);
for( int h = ; h < Bbins; h++ )
for( int s = ; s < Bbins; s++ )
{
float binVal = hist.at<float>(h, s);
//cout<<"h="<<h<<"s="<<s<<"binValue="<<binVal<<endl;
//int intensity = cvRound(binVal*255/maxVal);
int intensity = int(binVal*/maxVal);
rectangle( histImg, Point(h*scale, s*scale),
Point((h+)*scale - , (s+)*scale - ),
Scalar::all(intensity),CV_FILLED );
}
namedWindow( "Source", );
imshow( "Source", src );
namedWindow( "B-G Histogram", );
imshow( "B-G Histogram", histImg ); waitKey();
destroyAllWindows(); }

opencv学习之路(19)、直方图的更多相关文章

  1. opencv学习之路(20)、直方图应用

    一.直方图均衡化--equalizeHist() #include "opencv2/opencv.hpp" using namespace cv; void main() { 6 ...

  2. opencv学习之路【四】——opencv文件结构介绍

    这里要感谢这篇博主的文章 部分内容转载自此 opencv在2.3版本之前 都是用的c语言实现的 而在2.3以后的版本 做了很多重大的改变 其中最主要的是用c++重写大部分结构 然后文件的结构和2.0之 ...

  3. Opencv学习之路—Opencv下基于HOG特征的KNN算法分类训练

    在计算机视觉研究当中,HOG算法和LBP算法算是基础算法,但是却十分重要.后期很多图像特征提取的算法都是基于HOG和LBP,所以了解和掌握HOG,是学习计算机视觉的前提和基础. HOG算法的原理很多资 ...

  4. Opencv学习之路——自己编写的HOG算法

    #include<opencv2\core\core.hpp> #include<opencv2\highgui\highgui.hpp> #include<opencv ...

  5. OpenCV 学习之路(1)

    OpenCV的第一个代码: #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #i ...

  6. opencv学习之路(41)、人脸识别

    一.人脸检测并采集个人图像 //take_photo.cpp #include<opencv2/opencv.hpp> using namespace cv; using namespac ...

  7. opencv学习之路(40)、人脸识别算法——EigenFace、FisherFace、LBPH

    一.人脸识别算法之特征脸方法(Eigenface) 1.原理介绍及数据收集 特征脸方法主要是基于PCA降维实现. 详细介绍和主要思想可以参考 http://blog.csdn.net/u0100066 ...

  8. opencv学习之路(39)、PCA

    一.PCA理论介绍 网上已经有许多介绍pca原理的博客,这里就不重复介绍了.详情可参考 http://blog.csdn.net/zhongkelee/article/details/44064401 ...

  9. opencv学习之路(38)、Mat像素统计基础——均值,标准差,协方差;特征值,特征向量

    本文部分内容转自 https://www.cnblogs.com/chaosimple/p/3182157.html 一.统计学概念 二.为什么需要协方差 三.协方差矩阵 注:上述协方差矩阵还需要除以 ...

随机推荐

  1. poj1321_kuagnbin带你飞专题一

    棋盘问题 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 43565   Accepted: 21163 Descriptio ...

  2. 浏览器打开exe文件

    <win-r> regedit 打开注册表,然后自定义协议 自定义协议注册表.reg 打开后导入 Windows Registry Editor Version 5.00 [HKEY_CL ...

  3. Linux 的基本操作(系统用户及用户组的管理)

    [认识/etc/passwd和/etc/shadow] 这两个文件可以说是linux系统中最重要的文件之一.如果没有这两个文件或者这两个文件出问题,则你是无法正常登录linux系统的. /etc/pa ...

  4. web端MSF搭建

    去购买一个廉价VPS  阿里X/tx学生服务器然后选择Ubuntu系统http://jingyan.baidu.com/article/2c8c281dabacad0008252aa6.html安装M ...

  5. juqery 回车事件 回车操作 回车搜索

    html <form class="search_wrap" method="post" action=""> <div ...

  6. AJAX方法讲解

    Ajax的方法讲解 Ajax 异步请求,有点: 调高用户的体验度, 降低网络传输量 $.load() //异步加载页面 $.post()  Post 异步请求 $.post("url请求地址 ...

  7. 如何在vscode中调试python scrapy爬虫

    本文环境为 Win10 64bit+VS Code+Python3.6,步骤简单罗列下,此方法可以不用单独建一个Py入口来调用命令行 安装Python,从官网下载,过程略,这里主要注意将python目 ...

  8. Prime Flip AtCoder - 2689

    发现我们每次区间取反,相邻位置的正反关系只有两个位置发生改变 我们定义bi为ai和ai-1的正反关系,即ai=ai-1时bi=0,否则bi=1,每次取反l~r,b[l]和b[r+1]会发生改变 容易发 ...

  9. 我了解到的新知识之---Cylance Protect是干吗的?

    每家企业都会采购适合自己的杀毒软件来保护企业内的电脑处在安全的状态下,我所在的公司目前在用的是来自美国的初创企业的产品Cylance Protect.,目前这家公司已经在2018年11月份被黑莓公司收 ...

  10. MSCKF_VIO:MSCKF的双目版本

    论文:MSCKF的双目版本 Robust Stereo Visual Inertial Odometry for Fast Autonomous Flight 下载地址:点击 源码地址:https:/ ...