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 );
1.images是输入图片,

2.nimages是输入图片数目

3.channels:统计的通道,例如{0}或者{0,1,2}

3.mask:掩码

4.hist:统计输出结果

5.dims:维数

6.histSize每一维的直方图的尺寸大小

7.ranges:直方图每一维的数据大小范围。例如:{{0,2555}}(统计1个通道),{{0,2555}{0,2555}{0,2555}}(统计3个通道)

8.最后的参数默认为true,false。
我的源代码:
#include <cv.h>
#include <opencv2/core/core.hpp>  
#include <opencv2/imgproc/imgproc.hpp>  
#include <opencv2/highgui/highgui.hpp> 
using namespace std;
using namespace cv;
void mycalhist(Mat image){
	MatND hist;
	int bins = 256;    
    	int hist_size[] = {bins};    
    	float range[] = { 0, 256 };    
    	const float* ranges[] = { range};    
  	int channels[] = {0};    
	calcHist(&image, 1, channels, Mat(), // do not use mask    
        hist, 1, hist_size, ranges,    
        true, // the histogram is uniform    
        false);
	
	//计算出出现的频率
	int sum=image.cols*image.rows;
	float p[256];
	for(int i=0;i<256;i++){
		p[i]=hist.at<float>(i)/(1.0*sum);
		//cout<<p[i]<<" ";	
	}
	double max_val;  //直方图的最大值 
	minMaxLoc(hist, 0, &max_val, 0, 0); //计算直方图最大值
	//画出直方图
	int maxheight=256;
	Mat image2=Mat::zeros(256,2*256, CV_8UC3);
	for(int i=0;i<256;i++){
		//		计算高度
		double height=(maxheight*hist.at<float>(i))/(1.0*max_val);
		//画出对应的高度图
		//坐标体系中的零点坐标定义为图片的左上角,X轴为图像矩形的上面那条水平线,从左往右;Y轴为图像矩形左边的那条垂直线,从上往下。在Point(x,y)和Rect(x,y)中,第一个参数x代表的是元素所在图像的列数,第二个参数y代表的是元素所在图像的行数,而在at(x,y)中是相反的。
		rectangle(image2,Point(i*2,255),    
            	Point((i+1)*2 - 1, 255-height),    
            	CV_RGB(255,255,255));	
	}
	imshow("hist",image2);	
	//cout<<endl;
}
int main( int argc, char** argv )
{
	Mat image=imread("./1.jpg",CV_LOAD_IMAGE_GRAYSCALE);
	mycalhist(image);
	waitKey(0);
 	return 0;
}



原图像:

统计结果:


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值