示例程序015--HSV或RGB二维直方图
// 022 二维直方图.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <cv.h>
#include <highgui.h>
int main( int argc, char** argv )
{
IplImage* src;
src=cvLoadImage("Baboon.jpg");
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 };
IplImage* hsv = cvCreateImage( cvGetSize(src), 8, 3 );
cvCvtColor( src, hsv, CV_BGR2HSV ); //rgb->hsv
cvCvtPixToPlane( hsv, h_plane, s_plane, v_plane, 0 ); //将hsv图像分离到单通道图像中
//下面是RGB图像
// IplImage* b_plane = cvCreateImage( cvGetSize(src), 8, 1 );
// IplImage* g_plane = cvCreateImage( cvGetSize(src), 8, 1 );
//IplImage* r_plane = cvCreateImage( cvGetSize(src), 8, 1 );
//cvSplit(src,b_plane,g_plane,r_plane,0);
// cvSplit(src,v_plane,s_plane,h_plane,0);
int h_bins = 256, s_bins = 256; //色调和饱和度的bin的个数
int hist_size[] = {h_bins, s_bins};
float h_ranges[] = { 0, 255 }; //色调区间上下界
float s_ranges[] = { 0, 255 }; ///饱和度区间上下界
float* ranges[] = { h_ranges, s_ranges };
CvHistogram* hist=cvCreateHist( 2, hist_size, CV_HIST_ARRAY, ranges, 1 ); //创建直方图结构
int scale = 2;
IplImage* hist_img = cvCreateImage( cvSize(h_bins*scale,s_bins*scale), 8, 3 );
float max_value = 0;
cvCalcHist( planes, hist, 0, 0 ); //计算多张单通道图像image(s) 的直方图
cvGetMinMaxHistValue( hist, 0, &max_value, 0, 0 );
cvZero( hist_img );
//二维的图需要绘制每个点
int h, s;
for( h = 0; h < h_bins; h++ )
{
for( s = 0; s < s_bins; s++ )
{
float bin_val = cvQueryHistValue_2D( hist, h, s );
int intensity = cvRound(bin_val*s_bins*scale/max_value);
cvRectangle( hist_img, cvPoint( h*scale, s*scale ),
cvPoint( (h+1)*scale - 1, (s+1)*scale - 1),
CV_RGB(intensity,intensity,intensity),
CV_FILLED ); //CV_FILLED绘制填充了色彩的矩形
}
}
cvNamedWindow( "Source", 1 );
cvShowImage( "Source", src );
cvNamedWindow( "H-S Histogram", 1 );
cvShowImage( "H-S Histogram", hist_img );
cvWaitKey(0);
cvReleaseImage(&src);
cvReleaseImage(&h_plane);
cvReleaseImage(&s_plane);
cvReleaseImage(&v_plane);
cvReleaseImage(&hist_img);
cvDestroyAllWindows();
return 0;
}
运行结果: