Opencv直方图的生成与绘制

本文介绍如何使用OpenCV进行一维直方图计算,并通过实例演示了直方图的绘制过程。强调了计算直方图时使用指针或引用的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天做了一下opencv1的直方图实验,结果被坑了一上午。

直方图的含义十分简单,就是统计各个像素值的分布情况,因此我们的操作对象应该是一个单通道图,当然多通道图也可以,这样做出来的就是多维直方图,不过就一般应用而言,还是一维直方图用得比较多。

opencv中集成了计算直方图的函数,说实话,这个函数的传参有点过于复杂了,不过如果有个例子比照着写还是比较简单的。另外,要注意的是,如果要在函数中计算直方图,传参时务必要使用指针或者引用,只有这样,计算出的直方图才能在函数外部访问到,否则会一直出现错误。

/*
本函数用于计算直方图,注意传入参数必须为hist的引用
输入为单通道图,hist矩阵和bins的数目
*/
void myCal_Hist(Mat &Gray_img,Mat &hist,int binsNum)
{     
    int hist_size[] = {binsNum};    
    float range[] = { 0, 256 };    
    const float* ranges[] = { range};    
  
    int channels[] = {0};    
    //计算直方图  
    calcHist( &Gray_img, 1, channels, Mat(), // do not use mask    
        hist, 1, hist_size, ranges,    
        true, // the histogram is uniform    
        false );     
}  

/*
绘制hist图像
*/
void showHist(Mat &hist,int binsNum)
{
	int hist_w = 512; int hist_h = 400;
	int bin_w = cvRound( (double) hist_w/binsNum );

	 Mat histImage( hist_h, hist_w, CV_8UC3, Scalar( 0,0,0) );

	/// Normalize the result to [ 0, histImage.rows ]
	normalize(hist, hist, 0, histImage.rows, NORM_MINMAX, -1, Mat() );

	for(int i = 1;i < binsNum;i++)
	{
		line( histImage, Point( bin_w*(i-1), hist_h - cvRound(hist.at<float>(i-1)) ) ,
                       Point( bin_w*(i), hist_h - cvRound(hist.at<float>(i)) ),
                       Scalar( 255, 0, 0), 2, 8, 0  );
	}
    imshow("calcHist Demo", histImage );  
    
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值