opencv学习之路(19)、直方图
一、概述


二、一维灰度直方图
#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)、直方图的更多相关文章
- opencv学习之路(20)、直方图应用
一.直方图均衡化--equalizeHist() #include "opencv2/opencv.hpp" using namespace cv; void main() { 6 ...
- opencv学习之路【四】——opencv文件结构介绍
这里要感谢这篇博主的文章 部分内容转载自此 opencv在2.3版本之前 都是用的c语言实现的 而在2.3以后的版本 做了很多重大的改变 其中最主要的是用c++重写大部分结构 然后文件的结构和2.0之 ...
- Opencv学习之路—Opencv下基于HOG特征的KNN算法分类训练
在计算机视觉研究当中,HOG算法和LBP算法算是基础算法,但是却十分重要.后期很多图像特征提取的算法都是基于HOG和LBP,所以了解和掌握HOG,是学习计算机视觉的前提和基础. HOG算法的原理很多资 ...
- Opencv学习之路——自己编写的HOG算法
#include<opencv2\core\core.hpp> #include<opencv2\highgui\highgui.hpp> #include<opencv ...
- OpenCV 学习之路(1)
OpenCV的第一个代码: #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #i ...
- opencv学习之路(41)、人脸识别
一.人脸检测并采集个人图像 //take_photo.cpp #include<opencv2/opencv.hpp> using namespace cv; using namespac ...
- opencv学习之路(40)、人脸识别算法——EigenFace、FisherFace、LBPH
一.人脸识别算法之特征脸方法(Eigenface) 1.原理介绍及数据收集 特征脸方法主要是基于PCA降维实现. 详细介绍和主要思想可以参考 http://blog.csdn.net/u0100066 ...
- opencv学习之路(39)、PCA
一.PCA理论介绍 网上已经有许多介绍pca原理的博客,这里就不重复介绍了.详情可参考 http://blog.csdn.net/zhongkelee/article/details/44064401 ...
- opencv学习之路(38)、Mat像素统计基础——均值,标准差,协方差;特征值,特征向量
本文部分内容转自 https://www.cnblogs.com/chaosimple/p/3182157.html 一.统计学概念 二.为什么需要协方差 三.协方差矩阵 注:上述协方差矩阵还需要除以 ...
随机推荐
- VS2013生成XP独立运行程序
一.首先选择静态库 如果设置不对会出现如下错误 fatal error C1189: #error : Building MFC application with /MD[d] (CRT dll v ...
- POJ - 3279(枚举+暴力)
Fliptile Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 14297 Accepted: 5257 Descrip ...
- RabbitMQ之路由键转发消息
RabbitMQ学习 参考:https://www.jianshu.com/p/6b62a0ed2491 消息队列:目前流行的有 Kafka.RabbitMQ.ActiveMQ等 功能:为了解决消息的 ...
- 我了解到的新知识之—MPLS
下周末运营商来公司要对MPLS升级,对于一个多年权限管理经验的我来说未免有些陌生,幸好现在网络资源丰富,就开始了搜索之旅,找到了一些信息,所以在想干脆以后就开一个系列就叫<我了解到的新知识> ...
- 20175320 2018-2019-2 《Java程序设计》第3周学习总结
20175320 2018-2019-2 <Java程序设计>第3周学习总结 教材学习内容总结 本周学习了教材的第四章的内容.在这章中介绍了面向对象编程的概念以及Java编程中的类与对象, ...
- 腾讯TBS加载网页无法自适应记录
1. 所遇到的问题 webview加载指定网页无法实现自适应,之前在加载重构一个网页的时候,其实也遇到这种问题,然后就有了下面的一下步骤 WebSettings webSettings = view ...
- SpringBoot整合Swagger2
相信各位在公司写API文档数量应该不少,当然如果你还处在自己一个人开发前后台的年代,当我没说,如今为了前后台更好的对接,还是为了以后交接方便,都有要求写API文档. 手写Api文档的几个痛点: 文档需 ...
- Ethzasl MSF源码阅读(2):百川汇海
这里有个感觉,就是百川汇海.即IMU数据和相机的消息数据都汇集到msf_core进行处理.接上一篇, 1. 查看IMUHandler_ROS::IMUCallback和IMUHandler_ROS:: ...
- Java数组转List
问题:当使用Arrays.asList(a)将数组转为List集合后,进行add操作时,报UnsupportedOperationException异常. 数组转List,直接使用Arrays的asL ...
- Docker:使用自定义redis.conf运行redis容器(7)
演示环境:win7+docker toolbox 1.自定义配置文件 首先在Windows环境下准备好配置文件redis 然后打开Quickstart终端输入命令: cp -rf ~/Desktop/ ...