opencv2 直方图之calchist函数使用(转)
OpenCV提供了calcHist函数来计算图像直方图。
其中C++的函数原型如下:void calcHist(const Mat* arrays, int narrays, const int* channels, InputArray mask, OutputArray
hist, int dims, const int* histSize, const float** ranges, bool uniform=true, bool accumulate=
false );
void calcHist(const Mat* arrays, int narrays, const int* channels, InputArray mask, SparseMat&
hist, int dims, const int* histSize, const float** ranges, bool uniform=true, bool accumulate=
false );
参数解释:
arrays。输入的图像的指针,可以是多幅图像,所有的图像必须有同样的深度(CV_8U or CV_32F)。同时一副图像可以有多个channes。
narrays。输入的图像的个数。
channels。用来计算直方图的channes的数组。比如输入是2副图像,第一副图像有0,1,2共三个channel,第二幅图像只有0一个channel,
那么输入就一共有4个channes,如果int channels[3] = {3, 2, 0},那么就表示是使用第二副图像的第一个通道和第一副图像的第2和第0个通道来计
算直方图。
mask。掩码。如果mask不为空,那么它必须是一个8位(CV_8U)的数组,并且它的大小的和arrays[i]的大小相同,值为1的点将用来计算
直方图。
hist。计算出来的直方图
dims。计算出来的直方图的维数。
histSize。在每一维上直方图的个数。简单把直方图看作一个一个的竖条的话,就是每一维上竖条的个数。
ranges。用来进行统计的范围。比如
float rang1[] = {0, 20};
float rang2[] = {30, 40};
const float *rangs[] = {rang1, rang2};那么就是对0,20和30,40范围的值进行统计。
uniform。每一个竖条的宽度是否相等。
accumulate。Accumulation flag. If it is set, the histogram is not cleared in the beginning
when it is allocated. This feature enables you to compute a single histogram from several
sets of arrays, or to update the histogram in time. 是否累加。如果为true,在下次计算的时候不会首先清空hist。这个地方我是这样理解的,不知道有没有错,
请高手指点。
Histogram1D::Histogram1D(){
histSize[] = ;
hranges[] = 0.0;
hranges[] = 255.0;
ranges[] = hranges;
channels[] = ;
} cv::MatND Histogram1D::getHistogram(const cv::Mat &image){
cv::MatND hist;
cv::calcHist(&image, //source image
, //histogram from 1 image only
channels, //the channel used
cv::Mat(),//no mask is uesd
hist, //the resulting histogram
, //it is a 1D histogram
histSize, //number of bins
ranges //pixel value range
);//直方图函数
return hist;
}
下面是计算1维图像的直方图:
cv::Mat Histogram1D::getHistogramImage(const cv::Mat &image){
//compute histogram first
cv::MatND hist = getHistogram(image);
//get min and max bin values
double maxVal = ;
double minVal = ;
cv::minMaxLoc(hist,&minVal,&maxVal,,);
//Image on which to display histogram
cv::Mat histImg(histSize[],histSize[],CV_8U,cv::Scalar());
//set highest point at 90% of nbins
int hpt = static_cast<int>(0.9*histSize[]);
//Draw a vertical line for each bin
for (int h =;h<histSize[];h++)
{
float binVal = hist.at<float>(h);
int intensity = static_cast<int>(binVal*hpt/maxVal);
cv::line(histImg,cv::Point(h,histSize[]),cv::Point(h,histSize[]-intensity),cv::Scalar::all());
}
return histImg;
}
计算H-S直方图分布:
/*********************************************
内容:计算H-S 直方图分布
时间:2013 5.27
作者:恋上蛋炒面
*********************************************/
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv; void main()
{
Mat source = imread("baboon.jpg");
namedWindow("Source");
imshow("Source",source);
Mat hsv;
cvtColor(source,hsv,CV_BGR2HSV);
//Quantize the hue to 60 levels
//and the saturation to 64 levels
int hbins = ,sbins = ;
int histSize[] = {hbins,sbins};
int histSize[] = {hbins,sbins};
//hue varies from 0 to 179
float hranges[] = {,};
//saturation varies from 0 to 255
float sranges[] = {,};
const float *ranges[] = {hranges,sranges};
//two channels 0th,1th
int channels[] = {,};
MatND hist;
//compute h-s histogram
calcHist(&hsv,,channels,Mat(),hist,,histSize,ranges);
//get the max value
double maxVal = .;
minMaxLoc(hist,,&maxVal,,);
int scale = ;
//show the histogram on the image
Mat histImg = Mat::zeros(sbins*scale,hbins*scale,CV_8UC3);
for (int h = ;h < hbins;h++)
{
for (int s = ;s<sbins;s++)
{
float binVal = hist.at<float>(h,s);
int intensity = cvRound(binVal*0.9*/maxVal);
rectangle(histImg,Point(h*scale,s*scale),Point((h+)*scale-,(s+)*scale-),Scalar::all(intensity),CV_FILLED);
}
} namedWindow("H-S Histogram");
imshow("H-S Histogram",histImg);
imwrite("hshistogram.jpg",histImg);
waitKey();
}
RGB直方图:
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp> #include <fstream> using namespace cv;
using namespace std; void main()
{
//Mat source = imread("red.jpg");
Mat source = imread("baboon.jpg"); //读取图片
//Mat source(300,300,CV_8UC3,Scalar(1,1,244));
//imwrite("red.jpg",source);
namedWindow("Source");//窗口显示图片
imshow("Source",source);
//初始化calcHist函数的参数
int channels_r[],channels_g[],channels_b[],histSize[],range;
float hranges[];
const float *ranges[];
histSize[] = ;
hranges[] = 0.0;
hranges[] = 255.0;
ranges[] = hranges;
channels_b[] = ;
channels_g[] = ;
channels_r[] = ;
MatND hist_r,hist_g,hist_b; double max_val_r,max_val_g,max_val_b;
Mat histImage(histSize[],*histSize[],CV_8UC3); //定义一个显示直方图的图片,长256*3 高256
//R
calcHist(&source,,channels_r,Mat(),hist_r,,histSize,ranges);//分别计算R,G,B的直方图分布
minMaxLoc(hist_r,,&max_val_r,,);//计算直方图中统计最大值
//G
calcHist(&source,,channels_g,Mat(),hist_g,,histSize,ranges);
minMaxLoc(hist_g,,&max_val_g,,);
//B
calcHist(&source,,channels_b,Mat(),hist_b,,histSize,ranges);
minMaxLoc(hist_b,,&max_val_b,,); //将r,g,b的最大统计值,以及像素点从0-255的统计值写入txt中
ofstream outfile1("d:\\r.txt");
ofstream outfile2("d:\\g.txt");
ofstream outfile3("d:\\b.txt"); //在txt中写入最大统计值
outfile1<<"max_val_r = "<<max_val_r<<endl;
outfile2<<"max_val_g = "<<max_val_g<<endl;
outfile3<<"max_val_b = "<<max_val_b<<endl; for (int i =;i<histSize[];i++)
{
//R,G,B= i的统计值
float binVal_r = hist_r.at<float>(i);
float binVal_g = hist_g.at<float>(i);
float binVal_b = hist_b.at<float>(i);
//统一R,G,B统计值的大小,以高度的90%封顶
int intensity_r = static_cast<int>(0.9*histSize[]*binVal_r/max_val_r);
outfile1<<i<<" "<<binVal_r<<" "<<intensity_r<<endl;
int intensity_g = static_cast<int>(0.9*histSize[]*binVal_g/max_val_g);
outfile2<<i<<" "<<binVal_g<<" "<<intensity_g<<endl;
int intensity_b = static_cast<int>(0.9*histSize[]*binVal_b/max_val_b);
outfile3<<i<<" "<<binVal_b<<" "<<intensity_b<<endl;
//画出R,G,B的直方图直线
line(histImage,Point(i,histImage.rows),Point(i,histImage.rows-intensity_r),Scalar(,,));
line(histImage,Point(i+histSize[],histImage.rows),Point(i+histSize[],histImage.rows-intensity_g),Scalar(,,));
line(histImage,Point(i+histSize[]*,histImage.rows),Point(i+histSize[]*,histImage.rows-intensity_b),Scalar(,,));
}
namedWindow("RGB Histogram");
imshow("RGB Histogram",histImage);
imwrite("RGB_Histogram.jpg",histImage);
waitKey();
}
opencv2 直方图之calchist函数使用(转)的更多相关文章
- opencv2——直方图5
(一)图像直方图 图像的构成是有像素点构成的,每个像素点的值代表着该点的颜色(灰度图或者彩色图).所谓直方图就是对图像的中的这些像素点的值进行统计,得到一个统一的整体的灰度概念.直方图的好处就在于可以 ...
- OpenCV2:直方图
一.简介 在一个单通道的灰度图像中,每个像素的值介于0(黑色)~255(白色)之间,灰色图像的直方图有256个条目(或称为容器)
- opencv —— calcHist、minMaxLoc 计算并绘制图像直方图、寻找图像全局最大最小值
直方图概述 简单来说,直方图就是对数据进行统计的一种方法,这些数据可以是梯度.方向.色彩或任何其他特征.它的表现形式是一种二维统计表,横纵坐标分别是统计样本和该样本对应的某个属性的度量. 计算直方图: ...
- opencv直方图该怎么画
图像直方图是反映图像中像素分布特性的统计表,一般显示如下: 其中横坐标代表的是图像像素的种类,或者说是灰度级,纵坐标代表的是每一级灰度下像素数或者该灰度级下像素数在所有图像总像素数总所占的百分比. 直 ...
- 【浅墨著作】《OpenCV3编程入门》内容简单介绍&勘误&配套源码下载
经过近一年的沉淀和总结,<OpenCV3编程入门>一书最终和大家见面了. 近期有为数不少的小伙伴们发邮件给浅墨建议最好在博客里面贴出这本书的文件夹,方便大家更好的了解这本书的内容.事实上近 ...
- OpenCV编程入门目录
第一部分 快速上手OpenCV 第1 章 邂逅OpenCV 图像处理.计算机视觉与OpenCV OpenCV 概述 起源及发展 应用概述 .2OpenCV 基本架构分析 .3OpenCV3 带来了什么 ...
- 【Opencv】直方图函数 calchist()
calchist函数需要包含头文件 #include <opencv2/imgproc/imgproc.hpp> 函数声明(三个重载 calchist函数): //! computes t ...
- Opencv中直方图函数calcHist
calcHist函数在Opencv中是极难理解的一个函数,一方面是参数说明晦涩难懂,另一方面,说明书给出的实例也不足以令人完全搞清楚该函数的使用方式.最难理解的是第6,7,8个参数dims.histS ...
- OpenCV2+入门系列(四):计算图像的直方图,平均灰度,灰度方差
本篇懒得排版,直接在网页html编辑器编辑 在图像处理时,我们常常需要求出图像的直方图.灰度平均值.灰度的方差,这里给出一个opencv2+自带程序,实现这些功能. 直方图 对于直方图,使用cv::c ...
随机推荐
- 牛客网暑期ACM多校训练营(第四场):A Ternary String(欧拉降幂)
链接:牛客网暑期ACM多校训练营(第四场):A Ternary String 题意:给出一段数列 s,只包含 0.1.2 三种数.每秒在每个 2 后面会插入一个 1 ,每个 1 后面会插入一个 0,之 ...
- [转]有道云笔记markdown
作为半个文字工作者,一天当中,一半时间用在遣词造句,一半时间则在死磕排版.当听说“前所未有的极简语法”Markdown,不仅能简化排版.大大提高书写效率,而且上手零门槛.好奇宝宝怎么忍得住一颗蠢蠢欲动 ...
- snprintf vs sprintf
#include <stdio.h> int printf(const char *format, ...); int fprintf(FILE *stream, const char * ...
- dtd文件本地配置
在struts包解压出来以后的地方找
- 总结在Visual Studio Code创建Node.js+Express+handlebars项目
一.安装node.js环境. Node.js安装包及源码下载地址为:https://nodejs.org/en/download/ 32 位安装包下载地址 : https://nodejs.org/d ...
- 软工实践-Alpha 冲刺 (4/10)
队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 很胖,刚学,照猫画虎做了登录与注册界面. 展示GitHub ...
- Markdown使用github风格时报TLS错误解决办法
https://docs.microsoft.com/en-us/officeonlineserver/enable-tls-1-1-and-tls-1-2-support-in-office-onl ...
- Win2019 + Oracle18c SQLPLUS 命令行出现乱码的解决
1. Win2019 中文版 安装了 Oracle数据库, dbca 建库时选择的 的字符集是 ZHS16GBK 然后发现使用sqlplus 时有乱码的现象如图示: 2. csdn 上面有一个博客有解 ...
- mysql中联合查询
联合查询union 一个翻译问题的解释: 在mysql的手册中,将连接查询(Join)翻译为联合查询: 而联合查询(union),没有明确翻译. 但: 在通常的书籍或文章中,join被翻译为“连接”查 ...
- Spring Boot 学习资料【m了以后看】(转)
推荐博客: 程序员DD SpringBoot集成 liaokailin的专栏 纯洁的微笑 SpringBoot揭秘与实战 catoop的专栏 方志朋Spring Boot 专栏 简书Spring Bo ...