#include "stdafx.h"
#include "opencv2/opencv.hpp"
#define cvQueryHistValue_1D( hist, idx0 ) \
((float)cvGetReal1D( (hist)->bins, (idx0)))
IplImage* DrawHistogram(CvHistogram* hist, int scaleX= 1, int scaleY= 1)
{
float histMax= 0;
cvGetMinMaxHistValue(hist, 0, &histMax, 0, 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); //获取第i个bin 的值
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, (int )((1- nextValue/ histMax)* 64* scaleY));
CvPoint pt4= cvPoint( i* scaleX, (int)((1-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 _tmain(int argc, _TCHAR* argv[])
{
IplImage* src0= cvLoadImage("F://Opencv_picture//05.jpg ");
IplImage* src= cvCreateImage(cvGetSize(src0), IPL_DEPTH_8U, 3);
cvConvertScale(src0, src, 1.0, 0);
cvNamedWindow("src");
cvShowImage("src", src);
int dims= 1; //直方图的维度、
int sizes = 256; //直方图数据个数
float range[]= {0, 255}; //直方图每个维度取值范围
float * ranges[]= {range};
CvHistogram* hist;
hist= cvCreateHist(dims, &sizes, CV_HIST_ARRAY, ranges, 1);
cvClearHist(hist);
IplImage* b_img= cvCreateImage(cvGetSize(src), 8, 1);
IplImage* g_img= cvCreateImage(cvGetSize(src), 8, 1);
IplImage* r_img= cvCreateImage(cvGetSize(src), 8, 1);
cvSplit(src, b_img, g_img, r_img, NULL); //分解图像到三个图像的内存空间
cvCalcHist(&b_img, hist, 0, 0); // 统计一个通道的数据额到hist
b_img= DrawHistogram(hist);
cvClearHist(hist);
cvCalcHist(&g_img, hist, 0, 0);
g_img= DrawHistogram(hist);
cvClearHist(hist);
cvCalcHist(&r_img, hist, 0, 0);
r_img= DrawHistogram(hist);
cvClearHist(hist);
cvNamedWindow("B");
cvNamedWindow("G");
cvNamedWindow("R");
cvShowImage("B", b_img);
cvShowImage("G", g_img);
cvShowImage("R", r_img);
cvWaitKey(0);
cvReleaseImage(&src);
cvReleaseImage(&r_img);
cvReleaseImage(&b_img);
cvReleaseImage(&g_img);
cvDestroyWindow("src");
cvDestroyWindow("B");
cvDestroyWindow("G");
cvDestroyWindow("R");
return 0;
}
FillConvexPoly
填充凸多边形
void cvFillConvexPoly( CvArr* img, CvPoint* pts, int npts,
CvScalar color, int line_type=8, int shift=0 );
img
图像。
pts
指向单个多边形的指针数组。
npts
多边形的顶点个数。
color
多边形的颜色。
line_type
组成多边形的线条的类型。参见cvLine
shift
顶点坐标的小数点位数。
函数cvFillConvexPoly填充凸多边形内部。这个函数比函数cvFillPoly 更快。它除了可以填充凸多边形区域还可以填充任何的单调多边形。例如:一个被水平线(扫描线)至多两次截断的多边形。
直方图(下)
最新推荐文章于 2022-09-11 23:06:24 发布