OpenCV直方圖的繪制
標簽: OpenCV
OpenCV直方圖的繪制
1.直方圖的繪制
直方圖是通過將整個變量值范圍劃分為小的值范圍,然后計算每個間隔中落入多少個值來創建的。
使用calcHist函數計算直方圖,函數原型:
void calcHist( const Mat* images, int nimages,
const int* channels, InputArray mask,
SparseMat& hist, int dims,
const int* histSize, const float** ranges,
bool uniform = true, bool accumulate = false );
參數說明
/*
* 輸入圖像
* 輸入圖像數
* 數字通道尺寸
* 可選的 掩碼矩陣
* 存儲計算結果
* 直方圖 維度(圖像 取值的 空間維度)
* 要計算的 區間數(每個像素值一個區間)
* 輸入變量的范圍, 可能的 像素值 ,范圍0~255
*/
響應按鈕的回調函數
void showHistoCallback(int state, void* userData)
{
vector<Mat> bgr;
split( img, bgr );
int numbins= 256;
float range[] = { 0, 256 } ;
const float* histRange = { range };
Mat b_hist, g_hist, r_hist;
calcHist( &bgr[0], 1, 0, Mat(), b_hist, 1, &numbins, &histRange );
calcHist( &bgr[1], 1, 0, Mat(), g_hist, 1, &numbins, &histRange );
calcHist( &bgr[2], 1, 0, Mat(), r_hist, 1, &numbins, &histRange );
int width= 512;
int height= 300;
Mat histImage( height, width, CV_8UC3, Scalar(20,20,20) );
normalize(b_hist, b_hist, 0, height, NORM_MINMAX );
normalize(g_hist, g_hist, 0, height, NORM_MINMAX );
normalize(r_hist, r_hist, 0, height, NORM_MINMAX );
int binStep= cvRound((float)width/(float)numbins);
for( int i=1; i< numbins; i++)
{
line( histImage, Point( binStep*(i-1), height-cvRound(b_hist.at<float>(i-1) ) ), Point( binStep*(i), height-cvRound(b_hist.at<float>(i) ) ),Scalar(255,0,0) );
line( histImage, Point( binStep*(i-1), height-cvRound(g_hist.at<float>(i-1) ) ),Point( binStep*(i), height-cvRound(g_hist.at<float>(i) ) ),Scalar(0,255,0) );
line( histImage, Point( binStep*(i-1), height-cvRound(r_hist.at<float>(i-1) ) ), Point( binStep*(i), height-cvRound(r_hist.at<float>(i) ) ),Scalar(0,0,255) );
}
imshow("Histogram", histImage);
}
結果如下:
2.圖像均衡(直方圖均衡化)
均衡彩色圖像,可獲取均勻分布的直方圖,均衡的結果是圖像對比度的增加。均衡能夠使對比度較低的局部區域獲得高對比度,從而分散最頻繁的強度。
兩個主要缺點:背景噪聲的增加以及隨之而來的有用信號的減少。
為了均衡彩色圖像,只需均衡亮度通道。
void equalizeCallback(int state, void* userData)
{
Mat result;
// Convert BGR image to YCbCr
Mat ycrcb;
cvtColor( img, ycrcb, COLOR_BGR2YCrCb);
// Split image into channels
vector<Mat> channels;
split( ycrcb, channels );
// Equalize the Y channel only
equalizeHist( channels[0], channels[0] );
// Merge the result channels
merge( channels, ycrcb );
// Convert color ycrcb to BGR
cvtColor( ycrcb, result, COLOR_YCrCb2BGR );
// Show image
imshow("Equalized", result);
}
均衡后的直方圖:
智能推薦
opencv學習筆記三:直方圖的計算和繪制
前言 此代碼可依次復制粘貼,拼接即可運行 直方圖繪制時使用opencv的一項基本的能力,但當初接觸直方圖是我并沒有整太明白,如今又好好研究了一遍代碼,現在來總結一下。 直方圖,顧名思義,就是類似于我們常規意義上的統計圖,有三個術語: dims:需要統計的特征的數目。 bins:每個特征空間子區段的數目,可以翻譯為“直條”和“組距”。 range:每個...
OpenCV灰度直方圖繪制的兩種方式
一、前言 直方圖(Histogram)是對數據進行統計的一種方法,也是直觀表現數據分布特征的一種表現方式。在數字圖像分析過程中,通過圖像的灰度、梯度、方向和顏色等特征屬性的分布直方圖我們能更客觀分析圖像的某些特征,對直方圖的分布進行處理(如重排、區間映射等),往往能達到我們想要的視覺效果,比如:對灰度直方圖進行均衡化處理,擴散灰度區間,可以有效調整圖像對比度,以達到圖像增強的目的,所以在傳統低光照...
opencv學習系列——繪制給定圖片的直方圖分布
繪制給定圖片的直方圖分布 (代碼在文末~~) 直方圖顯示 (1)先不考慮第四通道,給定一張3通道的圖片,首先把多通道圖片分成單通道,對每個通道計算直方圖。計算直方圖直接調用cv中的calcHist函數: calcHist(const Mat* images, int nimages, const int* channels, InputArray mask, OutputArray hist, i...
OpenCV+python:直方圖的概念及繪制(Histogram)
1,直方圖的概念 圖像直方圖是反映一個圖像像素分布的統計表,其實橫坐標代表了圖像像素的種類,可以是灰度的,也可以是彩色的。縱坐標代表了每一種顏色值在圖像中的像素總數或者占所有像素個數的百分比。圖像是由像素構成,因為反映像素分布的直方圖往往可以作為圖像一個很重要的特征。 圖像灰度直方圖: 一幅圖像由不同灰度值的像素組成,圖像中灰度的分布情況是該圖像的一個重要特征。圖像的灰度直方圖就描述了圖像中灰度分...
猜你喜歡
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壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...