一、概述
二、一维灰度直方图
【示例】
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 }