opencv——灰度直方圖的繪製

#include <stdio.h>
#include <opencv2\opencv.hpp>
#include "cv.h"
#include "highgui.h"
#define _CRT_SECURE_NO_WARINGS
IplImage* Draw(CvHistogram* Hist,float sclarX=1,float sclarY=1)
{
	
	//歸一化參數
	float HistMax = 0;
	//獲取最大值
	cvGetMinMaxHistValue(Hist,0,&HistMax,0,0);
	//保存直方圖書記
	IplImage* imgHist = cvCreateImage(cvSize(256*sclarX,64*sclarY),8,1);
	cvZero(imgHist);
	for(int i=0;i<255;i++)
	{
	float HistValue = cvQueryHistValue_1D(Hist , i);
	float NextValue = cvQueryHistValue_1D(Hist , i+1);
	CvPoint pt1 = cvPoint(i*sclarX,64*sclarY);
	CvPoint pt2 = cvPoint((i+1)*sclarX,64*sclarY);
	CvPoint pt3 = cvPoint((i+1)*sclarX,64*sclarY*(1-(NextValue/HistMax)));
	CvPoint pt4 = cvPoint((i)*sclarX,64*sclarY*(1-(HistValue/HistMax)));

	int numPt5 = 5;
	CvPoint pts[5];
	pts[0] = pt1;
	pts[1] = pt2;
	pts[2] = pt3;
	pts[3] = pt4;
	pts[4] = pt1;
	cvFillConvexPoly(imgHist,pts,numPt5,cvScalar(255));
	
	}

return imgHist;
}

int main( int argc, char* argv[])
{
IplImage* src = cvLoadImage("2.jpg");

//設置直方圖參數
int dims = 1 ;
int size = 256 ; 
float range[] = {0,255};
float *ranges[]= {range};
CvHistogram *Hist;
//創建直方圖
Hist = cvCreateHist(dims,&size,CV_HIST_ARRAY,ranges,1);
cvClearHist(Hist);
//分解圖像
IplImage *imgRed = cvCreateImage(cvGetSize(src),8,1);
IplImage *imgGreen = cvCreateImage(cvGetSize(src),8,1);
IplImage *imgBlue = cvCreateImage(cvGetSize(src),8,1);

cvSplit(src,imgBlue,imgGreen,imgBlue,NULL);


//自動計算圖像直方圖
cvCalcHist(&imgBlue,Hist,0,0);

IplImage* HistBlue =Draw(Hist);
cvClearHist(Hist);

cvCalcHist(&imgGreen,Hist,0,0);
IplImage* HistGreen =Draw(Hist);
cvClearHist(Hist);

cvCalcHist(&imgRed,Hist,0,0);
IplImage* HistRed =Draw(Hist);
cvClearHist(Hist);

cvNamedWindow("src");
cvNamedWindow("HistRed");
cvNamedWindow("HistGreen");
cvNamedWindow("HistBlue");

cvShowImage("src",src);
cvShowImage("HistRed",HistRed);
cvShowImage("HistGreen",HistGreen);
cvShowImage("HistBlue",HistBlue);
cvWaitKey(0);
cvReleaseImage(&src);
cvReleaseImage(&HistRed);
cvReleaseImage(&HistGreen);
cvReleaseImage(&HistBlue);
cvDestroyWindow("src");
cvDestroyWindow("HistRed");
cvDestroyWindow("HistGreen");
cvDestroyWindow("HistBlue");
cvReleaseHist(&Hist);
return 0;
}
這程序不狗血!!!!!
但求大神能指點下,爲什麼調用函數不能在主函數之後!!!!!


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