一、概述

二、一维灰度直方图

 #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. oracle如何通过cmd导出某个用户下的所有表

    1:如果要导入的用户下有空表,需要执行下面语句 select 'alter table '||table_name||' allocate extent;' from user_tables wher ...

  2. poj 1228

    就是给你一堆点,看这些点能否构成一个 稳定的凸包. 凸包每条边上有3个及以上的点就可以了. #include <cstdio> #include <cstring> #incl ...

  3. php跨域发送请求原理以及同步异步问题

    <script async type="text/javascript" src="http://lisi.com/data.php?flag=1"> ...

  4. mysql批量update的两种方法

    today a question let me happy(抓狂) 头儿分了一个小任务,让修改循环调用dao层的那些不啦不啦不啦,鉴于之前写过批量更新的玩意,so 很快代码就修改完了,but 测的时候 ...

  5. word-break和word-wrap的使用和区别

    问题起源: 中文是一个字就是一个单词,而英文字母要有一个空格才将他们分割为一个单词:文字换行没事,主要是英文 <!DOCTYPE html> <html> <head&g ...

  6. Python学习之旅(十)

    Python基础知识(9):函数(Ⅰ) Python中函数的定义:是逻辑结构和过程化的一种编程方法 定义方法: def test(x): #def:定义函数的关键字 test:函数名 x:形参,也可以 ...

  7. ERP项目实施记录10

    好久没有更新,因为进度一直拖着.已经实施了20个月了,很多东西没有开发出来.原因多方面的,虽然在此打算吐槽一下开发公司,但其实很大部分责任还是在我们自己. 不多说了,看图:

  8. 用ps怎么修改照片的背景颜色??【申明:来源于网络】

    用ps怎么修改照片的背景颜色??[申明:来源于网络] 地址:http://wenda.so.com/q/1361505315060523?src=140

  9. jquery chrome中取select 的值一就返回了

    在 <div class="controls"> <select class="span2" data-val="true" ...

  10. MVCC&PURGE&分布式事务

    Ⅰ.MVCC介绍 consistent non-locking read,通过行多版本控制的方式读取当前执行时间点的记录 默认情况下innodb select没有任何锁,读到的记录在更新就通过undo ...