直方图(下)

#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 更快。它除了可以填充凸多边形区域还可以填充任何的单调多边形。例如:一个被水平线(扫描线)至多两次截断的多边形。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值