21、【opencv入门】直方图

一、概述

 二、一维灰度直方图

【示例】

 1 //一维灰度直方图
 2 #include "opencv2/opencv.hpp"
 3 #include<iostream>
 4 
 5 using namespace cv;
 6 using namespace std;
 7 
 8 int main()
 9 {
10     Mat img = imread("1.jpg", 0);  //以灰度方式打开,灰度图和彩色图直方图结果不同
11     imshow("src", img);
12 
13     Mat dstHist;  //定义存储直方图变量
14     int dims = 1;  //需要统计的特征数目(只统计灰度值)
15     float hranges[] = {0, 256};  //范围[0,256),注意是最大值加1
16     const float* ranges[] = {hranges};
17     int bins = 256;//组距:简单理解为直方图分为几个柱子
18     int channels = 0;
19     //计算直方图
20     calcHist(&img, 1, &channels, Mat(), dstHist, dims, &bins, ranges);
21 
22     int scale = 1;
23     Mat dstImg(bins * scale, bins*3, CV_8UC3, Scalar(0));  //定义直方图输出图像,长×宽
24     double minValue = 0;
25     double maxValue = 0;
26     minMaxLoc(dstHist, &minValue, &maxValue);//统计直方图dstHist的最小最大值,并返回该值位置
27     int hpt = saturate_cast<int>(0.9*bins);  //设置最大值并防止溢出
28     int j=0;
29     //绘制直方图
30     for(int i=0; i<256; i++)
31     {
32         float binValue = dstHist.at<float>(i);
33         //if(i>250)
34             cout<<"i="<<i<<"---Value="<<binValue<<endl;
35         int realValue = saturate_cast<int>(binValue*hpt/maxValue);  //归一化数据
36             //cout<<"i="<<i<<"---Value="<<realValue<<endl;
37         //line(dstImg, Point(i*scale, bins-1), Point(i*scale, bins-realValue), Scalar(0, 255, 0), 1, 8);//左上角和右下角坐标,坐标系如下图所示
38         //rectangle(dstImg, Point(i*scale, bins-1), Point(i*scale+1, bins-realValue), Scalar(0, 255, 0), 1);
39         //rectangle(dstImg, Point(j*scale, bins-1), Point(j*scale+1, bins-realValue), Scalar(rand()%255, rand()%255, rand()%255), -1);
40         rectangle(dstImg, Point(j*scale, bins-1), Point(j*scale+1, bins-realValue), Scalar(rand()%255, rand()%255, rand()%255), -1);
41         j=j+3;
42     }
43     imshow("Histogram", dstImg);
44     waitKey(0);
45     destroyAllWindows();
46     return 0;
47 }

 三、不均匀灰度直方图

【示例】

 1 //不均匀灰度直方图
 2 #include "opencv2/opencv.hpp"
 3 #include<iostream>
 4 
 5 using namespace cv;
 6 using namespace std;
 7 
 8 int main()
 9 {
10     Mat img = imread("1.jpg",0);
11     imshow("src", img);
12 
13     Mat dstHist;
14     int channels = 0;
15     int histSize[1]={5};
16     float hranges[6]={0,50,100,150,200,256};
17     const float* ranges[1]={hranges};
18     int size=256;
19     //计算直方图
20     calcHist(&img,1,&channels,Mat(),dstHist,1,histSize,ranges,false);
21 
22     int scale=1;
23     Mat dstImg(size*scale,size,CV_8UC3,Scalar(0));
24     double minValue=0;
25     double maxValue=0;
26     minMaxLoc(dstHist,&minValue,&maxValue,0,0);
27     int hpt=saturate_cast<int>(0.9*size);//设置最大值并防止溢出
28     int j=0;
29     for (int i = 0; i < 5; i++)
30     {
31         float binValue=dstHist.at<float>(i);
32         cout<<"i="<<i<<"---Value="<<binValue<<endl;
33         int realValue=saturate_cast<int>(binValue*hpt/maxValue);
34         rectangle(dstImg,Point(j*scale,size-1),Point((j+20)*scale-1,size-realValue),Scalar(0, 255, 0), -1);
35         j+=35;
36     }
37 
38     imshow("Histogram", dstImg);
39     waitKey(0);
40     destroyAllWindows();
41     return 0;
42 }

四、RGB三色直方图

【示例】

 1 //RGB三色直方图
 2 #include "opencv2/opencv.hpp"
 3 using namespace cv;
 4 
 5 int main()
 6 {
 7     Mat src=imread("1.jpg");
 8     int bins = 256;
 9     int hist_size[] = {bins};
10     float range[] = { 0, 256 };
11     const float* ranges[] = { range};
12     Mat hist_r,hist_g,hist_b;
13 
14     int channels_r[] = {2};
15     calcHist( &src, 1, channels_r, Mat(), // do not use mask
16         hist_r, 1, hist_size, ranges,
17         true, // the histogram is uniform
18         false );
19 
20     int channels_g[] = {1};
21     calcHist( &src, 1, channels_g, Mat(),hist_g, 1, hist_size, ranges,true,false);
22     int channels_b[] = {0};
23     calcHist( &src, 1, channels_b, Mat(),hist_b, 1, hist_size, ranges,true,false);
24 
25     double max_val_r,max_val_g,max_val_b;
26     minMaxLoc(hist_r, 0, &max_val_r, 0, 0);
27     minMaxLoc(hist_g, 0, &max_val_g, 0, 0);
28     minMaxLoc(hist_b, 0, &max_val_b, 0, 0);
29     int scale = 1;
30     int hist_height=256;
31     Mat hist_img = Mat::zeros(hist_height, bins*3+5, CV_8UC3);
32     for(int i=0;i<bins;i++)
33     {
34         float bin_val_r = hist_r.at<float>(i);
35         float bin_val_g = hist_g.at<float>(i);
36         float bin_val_b = hist_b.at<float>(i);
37         int intensity_r = cvRound(bin_val_r*hist_height/max_val_r);  //要绘制的高度
38         int intensity_g = cvRound(bin_val_g*hist_height/max_val_g);  //要绘制的高度
39         int intensity_b = cvRound(bin_val_b*hist_height/max_val_b);  //要绘制的高度
40         rectangle(hist_img,Point(i*scale,hist_height-1),
41             Point((i+1)*scale - 1, hist_height - intensity_r),
42             CV_RGB(255,0,0));
43 
44         rectangle(hist_img,Point((i+bins)*scale,hist_height-1),
45             Point((i+bins+1)*scale - 1, hist_height - intensity_g),
46             CV_RGB(0,255,0));
47 
48         rectangle(hist_img,Point((i+bins*2)*scale,hist_height-1),
49             Point((i+bins*2+1)*scale - 1, hist_height - intensity_b),
50             CV_RGB(0,0,255));
51 
52     }
53     imshow( "src", src );
54     imshow( "RGB Histogram", hist_img );
55 
56     waitKey(0);
57     destroyAllWindows();
58     return 0;
59 }
原文地址:https://www.cnblogs.com/Long-w/p/9663507.html