圖像處理 灰度圖像直方圖

編程環境: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);
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章