【笔记】Opencv 画直方图

void calcHist( const Mat* images, int nimages,
                          const int* channels, InputArray mask,
                          OutputArray hist, int dims, const int* histSize,
                          const float** ranges, bool uniform=true, bool accumulate=false );

 

#include "core/core.hpp"
#include "highgui/highgui.hpp"
#include "imgproc/imgproc.hpp"
 
using namespace cv;
 
int main(int argc,char *argv[])
{
	Mat image,imageGray,imageHist,imageNormalize;
	image=imread(argv[1]);
	if(!image.data)
	{
		return -1;
	}
	// RGB三通道图像转化成单通道灰度图像
	// 也可以直接在imread函数里第二个参数设为0获取灰度图像
	cvtColor(image,imageGray,CV_RGB2GRAY);  
	const int histSize=255;   //定义灰度级数量
	float histR[]={0,255};   //定义每个灰度级下取值范围
	const float *histRange=histR;
 
	//计算直方图
	calcHist(&imageGray,1,0,Mat(),imageHist,1,&histSize,&histRange,true,false);
 
	//直方图归一化到范围[0,histSize]
	normalize(imageHist,imageNormalize,0,histSize,NORM_MINMAX,-1,Mat());
 
	//创建直方图画布
	Mat imageShowHist(histSize,histR[1],CV_8UC3,Scalar(0,0,0));
 
	//分别画出每个灰度级下的直方图分布
	for(int i=0;i<histSize;i++)
	{
		line(imageShowHist,Point(i,histR[1]),Point(i,histR[1]-cvRound(imageNormalize.at<float>(i))),Scalar(0,0,255),1,8,0);
	}
	imshow("Moon",image); imshow("MoonGray",imageGray);
	imshow("Hist",imageShowHist);
	waitKey();
	return 0;
}

 

 

Opencv文档教程之直方图计算 

例程代码照抄如下:

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
 
using namespace std;
using namespace cv;
 
/** @函数 main */
int main( int argc, char** argv )
{
	Mat src, dst;
 
	/// 装载图像
	src = imread( argv[1], 1 );
 
	if( !src.data )
	{ return -1; }
 
	/// 分割成3个单通道图像 ( R, G 和 B )
	vector<Mat> rgb_planes;
	split( src, rgb_planes );
 
	/// 设定bin数目
	int histSize = 255;
 
	/// 设定取值范围 ( R,G,B) )
	float range[] = { 0, 255 } ;
	const float* histRange = { range };
 
	bool uniform = true; bool accumulate = false;
 
	Mat r_hist, g_hist, b_hist;
 
	/// 计算直方图:
	calcHist( &rgb_planes[0], 1, 0, Mat(), r_hist, 1, &histSize, &histRange, uniform, accumulate );
	calcHist( &rgb_planes[1], 1, 0, Mat(), g_hist, 1, &histSize, &histRange, uniform, accumulate );
	calcHist( &rgb_planes[2], 1, 0, Mat(), b_hist, 1, &histSize, &histRange, uniform, accumulate );
 
	// 创建直方图画布
	int hist_w = 400; int hist_h = 400;
	<span style="color:#ff0000;">int bin_w = cvRound( (double) hist_w/histSize );</span>
 
	Mat histImage( hist_w, hist_h, CV_8UC3, Scalar( 0,0,0) );
 
	/// 将直方图归一化到范围 [ 0, histImage.rows ]
	normalize(r_hist, r_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat() );
	normalize(g_hist, g_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat() );
	normalize(b_hist, b_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat() );
 
	/// 在直方图画布上画出直方图
	for( int i = 1; i < histSize; i++ )
	{
		// 加入了三个if语句,为了比对直方图,不是例程程序所有
		if(i==180)
		{
			imshow("180",histImage);
		}
		if(i==200)
		{
			imshow("199",histImage);
		}
		if(i==210)
		{
			imshow("210",histImage);
		}
 
		line( histImage, <span style="color:#ff0000;">Point( bin_w*(i-1), hist_h - cvRound(r_hist.at<float>(i-1)) )</span> ,
			Point( bin_w*(i), hist_h - cvRound(r_hist.at<float>(i)) ),
			Scalar( 0, 0, 255), 2, 8, 0  );
		line( histImage, Point( bin_w*(i-1), hist_h - cvRound(g_hist.at<float>(i-1)) ) ,
			Point( bin_w*(i), hist_h - cvRound(g_hist.at<float>(i)) ),
			Scalar( 0, 255, 0), 2, 8, 0  );
		line( histImage, Point( bin_w*(i-1), hist_h - cvRound(b_hist.at<float>(i-1)) ) ,
			Point( bin_w*(i), hist_h - cvRound(b_hist.at<float>(i)) ),
			Scalar( 255, 0, 0), 2, 8, 0  );
	}
 
	/// 显示直方图
	namedWindow("calcHist Demo", CV_WINDOW_AUTOSIZE );
	imshow("calcHist Demo", histImage );
 
	waitKey(0);
 
	return 0;
 
}

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值