編程環境:windows下結合opencv.
//計算並獲取圖像的均勻灰度直方圖
//dst表示灰度直方圖圖像,三通道彩色圖像
//nBins表示灰度直方圖劃分的間隔數
//scalarHistColor表示灰度直方圖的顏色
void GrayHist(IplImage* src, IplImage* dst, int nBins, CvScalar scalarHistColor);
void GrayHist(IplImage* src, IplImage* dst, int nBins, CvScalar scalarHistColor)
{
if (!src || !dst)
{
return;
}
if (src->nChannels == 3)
{
cvCvtColor(src, src, CV_BGR2GRAY);
}
//直方圖中單個條形圖的長度和高度
int nWidth = dst->width / nBins;
int nHeight = 0;
int nSizeArray[] = {nBins};
float fRangeArray[] = {0, 255};
float* fRange = fRangeArray;
CvHistogram* pHistGray = cvCreateHist(1, nSizeArray, CV_HIST_ARRAY, &fRange, 1);
float fMaxVal;//灰度直方圖最大值
double dVal;
cvCalcHist(&src, pHistGray);//計算灰度直方圖
//cvNormalizeHist(pHistGray, 1.0);//歸一化直方圖
//cvThreshHist(pHistGray, 0.01);//閾值化直方圖,將小於0.01的剔除
cvGetMinMaxHistValue(pHistGray, NULL, &fMaxVal);//獲取直方圖最大值
//畫出灰度直方圖
cvZero(dst);//填充底色
for(int i = 0; i < nBins; i++)
{
dVal = cvQueryHistValue_1D(pHistGray, i);
nHeight = (dVal / fMaxVal) * dst->height;//計算當前條形圖的高度
//繪製直方圖
cvRectangle(dst, cvPoint(nWidth * i, dst->height - nHeight),
cvPoint(nWidth * (i + 1), dst->height), scalarHistColor);
}
//繪製閾值線
//nHeight = (0.01 / fMaxVal) * dst->height;//計算閾值線高度
//cvLine(dst, cvPoint(0, dst->height - nHeight), cvPoint(dst->width, dst->height - nHeight), CV_RGB(255, 0, 0));
cvReleaseHist(&pHistGray);
}