天天看點

OPENCV+VS2013擷取圖像灰階直方圖

#include "stdafx.h"
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"

#define cvQueryHistValue_1D( hist, idx0 ) \
	((float)cvGetReal1D((hist)->bins, (idx0)))

IplImage*DrawHistogram(CvHistogram*hist, float scaleX = 3, float scaleY = 3)
{
	float histMax = 0;
	cvGetMinMaxHistValue(hist, 0, &histMax, 0);
	IplImage*imgHist = cvCreateImage(CvSize(256 * scaleX, 64 * scaleY), 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 * scaleX, 64 * scaleY);		
		CvPoint pt2 = cvPoint((i + 1) * scaleX, 64 * scaleY);
		CvPoint pt3 = cvPoint((i + 1) * scaleX, (64 - (nextValue/histMax)*64)*scaleY);
		CvPoint pt4 = cvPoint(      i * scaleX, (64 - (histValue/histMax)*64)*scaleY);

		int numPts = 5;
		CvPoint pts[5];
		pts[0] = pt1;
		pts[1] = pt2;
		pts[2] = pt3;
		pts[3] = pt4; 
		pts[4] = pt1;
		cvFillConvexPoly(imgHist, pts, numPts, cvScalar(255));//多邊形内部填充
	}
	return imgHist;
}

int main()
{
	IplImage*src = cvLoadImage("D:\\1.jpg"); //讀圖
	cvNamedWindow("sr");		
	cvShowImage("sr", src);
	cvWaitKey(0);

	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, imgRed, NULL);		//擷取三通道值

	cvCalcHist(&imgBlue, hist, 0, 0);		//B通道分量
	IplImage*histBlue = DrawHistogram(hist);
	cvClearHist(hist);

	cvCalcHist(&imgGreen, hist, 0, 0);
	IplImage*histGreen = DrawHistogram(hist);
	cvClearHist(hist);

	cvCalcHist(&imgRed, hist, 0, 0);
	IplImage*histRed = DrawHistogram(hist);
	cvClearHist(hist);

	cvNamedWindow("B");
	cvNamedWindow("G");
	cvNamedWindow("R");

	cvShowImage("B", histBlue);
	cvShowImage("G",histGreen);
	cvShowImage("R", histRed);

	cvWaitKey(0);
	return 0;
}
           

效果圖如下:

OPENCV+VS2013擷取圖像灰階直方圖