【OpenCV】繪制直方圖
和這一篇《數字圖像直方圖》內容是一樣的,只是使用Mat格式實現~
繪制灰色直方圖
//繪制灰度直方圖
int main( )
{
Mat src,gray;
src=imread("baboon.jpg");
cvtColor(src,gray,CV_RGB2GRAY);
int bins = 256;
int hist_size[] = {bins};
float range[] = { 0, 256 };
const float* ranges[] = { range};
MatND hist;
int channels[] = {0};
calcHist( &gray, 1, channels, Mat(), // do not use mask
hist, 1, hist_size, ranges,
true, // the histogram is uniform
false );
double max_val;
minMaxLoc(hist, 0, &max_val, 0, 0);
int scale = 2;
int hist_height=256;
Mat hist_img = Mat::zeros(hist_height,bins*scale, CV_8UC3);
for(int i=0;i<bins;i++)
{
float bin_val = hist.at<float>(i);
int intensity = cvRound(bin_val*hist_height/max_val); //要繪制的高度
rectangle(hist_img,Point(i*scale,hist_height-1),
Point((i+1)*scale - 1, hist_height - intensity),
CV_RGB(255,255,255));
}
imshow( "Source", src );
imshow( "Gray Histogram", hist_img );
waitKey(10000000000);
return 0;
}
實驗結果:

繪制RGB三色直方圖
//繪制RGB三色分量直方圖
int main( )
{
Mat src;
src=imread("baboon.jpg");
int bins = 256;
int hist_size[] = {bins};
float range[] = { 0, 256 };
const float* ranges[] = { range};
MatND hist_r,hist_g,hist_b;
int channels_r[] = {0};
calcHist( &src, 1, channels_r, Mat(), // do not use mask
hist_r, 1, hist_size, ranges,
true, // the histogram is uniform
false );
int channels_g[] = {1};
calcHist( &src, 1, channels_g, Mat(), // do not use mask
hist_g, 1, hist_size, ranges,
true, // the histogram is uniform
false );
int channels_b[] = {2};
calcHist( &src, 1, channels_b, Mat(), // do not use mask
hist_b, 1, hist_size, ranges,
true, // the histogram is uniform
false );
double max_val_r,max_val_g,max_val_b;
minMaxLoc(hist_r, 0, &max_val_r, 0, 0);
minMaxLoc(hist_g, 0, &max_val_g, 0, 0);
minMaxLoc(hist_b, 0, &max_val_b, 0, 0);
int scale = 1;
int hist_height=256;
Mat hist_img = Mat::zeros(hist_height,bins*3, CV_8UC3);
for(int i=0;i<bins;i++)
{
float bin_val_r = hist_r.at<float>(i);
float bin_val_g = hist_g.at<float>(i);
float bin_val_b = hist_b.at<float>(i);
int intensity_r = cvRound(bin_val_r*hist_height/max_val_r); //要繪制的高度
int intensity_g = cvRound(bin_val_g*hist_height/max_val_g); //要繪制的高度
int intensity_b = cvRound(bin_val_b*hist_height/max_val_b); //要繪制的高度
rectangle(hist_img,Point(i*scale,hist_height-1),
Point((i+1)*scale - 1, hist_height - intensity_r),
CV_RGB(255,0,0));
rectangle(hist_img,Point((i+bins)*scale,hist_height-1),
Point((i+bins+1)*scale - 1, hist_height - intensity_g),
CV_RGB(0,255,0));
rectangle(hist_img,Point((i+bins*2)*scale,hist_height-1),
Point((i+bins*2+1)*scale - 1, hist_height - intensity_b),
CV_RGB(0,0,255));
}
imshow( "Source", src );
imshow( "RGB Histogram", hist_img );
waitKey(10000000000);
return 0;
}
實驗結果:

繪制二維直方圖
//繪制H-S二維直方圖
int main( )
{
Mat src,hsv;
src=imread("baboon.jpg");
cvtColor(src, hsv, CV_BGR2HSV);
// Quantize the hue to 30 levels
// and the saturation to 32 levels
int hbins = 256, sbins = 180;
int histSize[] = {hbins, sbins};
// hue varies from 0 to 179, see cvtColor
float hranges[] = { 0, 180 };
// saturation varies from 0 (black-gray-white) to
// 255 (pure spectrum color)
float sranges[] = { 0, 256 };
const float* ranges[] = { hranges, sranges };
MatND hist;
// we compute the histogram from the 0-th and 1-st channels
int channels[] = {0, 1};
calcHist( &hsv, 1, channels, Mat(), // do not use mask
hist, 2, histSize, ranges,
true, // the histogram is uniform
false );
double maxVal=0;
minMaxLoc(hist, 0, &maxVal, 0, 0);
int scale = 2;
Mat histImg = Mat::zeros(sbins*scale, hbins*scale, CV_8UC3);
for( int h = 0; h < hbins; h++ )
for( int s = 0; s < sbins; s++ )
{
float binVal = hist.at<float>(h, s);
int intensity = cvRound(binVal*255/maxVal);
rectangle( histImg, Point(h*scale, s*scale),
Point( (h+1)*scale - 1, (s+1)*scale - 1),
Scalar::all(intensity),
CV_FILLED );
}
namedWindow( "Source", 1 );
imshow( "Source", src );
namedWindow( "H-S Histogram", 1 );
imshow( "H-S Histogram", histImg );
waitKey(10000000000);
return 0;
}
實驗結果:

(轉載請注明作者和出處:http://blog.csdn.net/xiaowei_cqu未經允許請勿用于商業用途)
智能推薦
使用Opencv繪制灰度直方圖/對比
一.所需結構體 結構體原型: 二.所需函數 1.cvCalcHist: 函數功能:用于計算圖像直方圖 函數原型: 參數介紹: 返回值:無 2.CvCreateHist: 函數功能:用于創建直方圖 函數原型: 參數介紹: 返回值:成功返回一個指向堆中CvHistogram結構體的CvHistogram指針 3.cvGetMinMaxHistValue: 函數功能:用于統計直方圖中最小值和最大值 函數...
opencv(18)---直方圖計算以及繪制
基本概念 直方圖是對數據進行統計的一種方法, 可以直觀表現圖像某屬性的數值(頻率)分布情況, 包括灰度直方圖、RGB直方圖等 數字直方圖 圖像直方圖 相關概念 函數原型 1.dims: 需要統計得特征的數目, 只統計灰度值—dims=1 統計RGB值—dims=3 2.bins: 每個特征空間子區域段的數目,也 可稱為組距(簡單理解為直方圖分 成幾個柱子組成) 3.rang...
猜你喜歡
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...