一、概述

二、一维灰度直方图

 #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. 使用redis接管cookie

    class RedisCookie { // 默认配置名称(使用load_config加载) private $_default_config_path = 'package/cache/redis_ ...

  2. jquery和ajax和springmvc

    <script type="text/javascript" src="js/jquery-1.11.1.js"></script> $ ...

  3. Tcp/IP 的四层模型

    维基:https://zh.wikipedia.org/wiki/TCP/IP%E5%8D%8F%E8%AE%AE%E6%97%8F 因特网协议组 LITA 因特网协议组 Link  网络接口层 以太 ...

  4. java学习之路--StringBuffer常见的功能和实例

    ---恢复内容开始--- 储存 StringBuffer append();将指定数据作为参数添加到已有数据尾处 StringBuffer insert(index,数据):可以将数据插到指定的ind ...

  5. 剑指offer——python【第14题】链表中倒数第k个节点

    题目描述 输入一个链表,输出该链表中倒数第k个结点. 思路 注意,看清楚,是输出节点,而不是输出节点值 可以先求出链表总长度,然后正向遍历得到第n个节点 解答 class Solution: def ...

  6. 班级作业:Java Web环境的搭建

    Java Web环境的搭建 一.开发所需工具.(根据你的电脑以及系统选择合适的版本下载) 1.JDK .下载链接:https://www.oracle.com/technetwork/java/jav ...

  7. easyui combobox 去空格事件 去掉,结果输入空格体验不畅的感觉,让combobox能够输入空格

    $("[comboname=name]").next("span").find("input.textbox-text").unbind(& ...

  8. DEMO大全,超赞【申明:来源于网络】

    DEMO大全,超赞[申明:来源于网络] 地址:http://www.verydemo.com/one_c55.html

  9. openERP笔记,自定义开发模块

    ##目标 OpenERP模块基本结构 使用模块添加额外的字段(Date Required和Rush Order) 扩展视图, 让OpenERP能够显示新的字段 修改用于OpenERP工作流的可用状态 ...

  10. ES6 函数

    函数参数的扩展 默认参数 基本用法 function fn(name,age=17){ console.log(name+","+age); } fn("Amy" ...