《学习OpenCV》练习7-6

#include "cv.h"
#include "highgui.h"

//*****************************************************
//画直方图函数:根据输入图像,显示HSV二维直方图
//src        :指向输入图像的指针
//h_bins     :H分量(hue色调)在直方图里划分的等级
//s_bins     :S分量(saturation饱和度)在直方图里划分的等级
//scale      :直方图每个矩形的宽度
//width      :直方图的宽度
//height     :直方图的高度
//srcname[]  :用于储存载入源图像窗口的名字
//histname[] :用于储存显示直方图图像的窗口的名字
//返回值hist  :指向生成的直方图的指针
//*****************************************************
CvHistogram* myHSVHistogram( IplImage* src, int h_bins, int s_bins, int scale, int width, int height, const char srcname[], const char histname[] )
{
	if (src==NULL || src->nChannels!=3)
	{
		return NULL;
	}

	/*hsv图像初始化*/
	IplImage* hsv = cvCreateImage( cvGetSize(src), 8, 3 );
	IplImage* h_plane = cvCreateImage( cvGetSize(src), 8, 1 );
	IplImage* s_plane = cvCreateImage( cvGetSize(src), 8, 1 );
	IplImage* v_plane = cvCreateImage( cvGetSize(src), 8, 1 );
	IplImage* planes[] = { h_plane, s_plane };

	/*H分量(hue色调)划分等级,S分量(saturation饱和度)划分等级*/
	int hist_size[] = { h_bins, s_bins };
 
	/*H分量、S分量的变化范围*/
	float h_ranges[] = { 0, 180 }; 
	float s_ranges[] = { 0, 255 };
	float* ranges[] = { h_ranges, s_ranges };
 
	/*输入图像转换到HSV颜色空间,并将h、s、v分别分割到各自的单通道图像上*/
	cvCvtColor( src, hsv, CV_BGR2HSV );
	cvSplit( hsv, h_plane, s_plane, v_plane, 0 );
 
	/*创建直方图,二维, 每个维度上均分*/
	CvHistogram * hist = cvCreateHist( 2, hist_size, CV_HIST_ARRAY, ranges, 1 );

	/*根据H、S两个平面数据统计planes图像的直方图*/
	cvCalcHist( planes, hist, 0, 0 );
 
	/*获取直方图统计的最大值,用于动态显示直方图*/
	float max_value;
	cvGetMinMaxHistValue( hist, 0, &max_value, 0, 0 );

	/*设置直方图显示图像的高度、宽度*/										
	IplImage* hist_img = cvCreateImage( cvSize(width,height), 8, 3 );	
	cvZero( hist_img );
 
	/*用来进行HSV到RGB颜色转换的临时单位图像*/
	IplImage* hsv_color = cvCreateImage(cvSize(1,1),8,3);					//单位图像,相当于一个8bit、3通道的像素点
	IplImage* rgb_color = cvCreateImage(cvSize(1,1),8,3);

	/*for循环显示矩形*/
	for (int h=0; h
《学习OpenCV》练习7-6_第1张图片

你可能感兴趣的:(OpenCV,c,opencv,图像处理,图形)