## 直方图与匹配 - 直方图的计算与显示(cvCalcHist)

### 第七章 - 直方图与匹配 - 直方图的计算与显示(cvCalcHist)

http://blog.csdn.net/hitwengqi/article/details/6912015

----------------------------------------------------------------------------------------------

# cvCvtPixToPlane

openCV里面的一个函数

可以看作cvSplit是他的宏：

#define cvCvtPixToPlane cvSplit

void cvSplit( const CvArr* src, CvArr* dst0, CvArr* dst1,CvArr* dst2, CvArr* dst3 );

作用是：分割多通道数组成几个单通道数组或者从数组中提取一个通道

一般用法是cvCvtPixToPlane（IplImage * src,IplImage * dst1,IplImage *dst2,IplImage * dst3,IplImage *dst4)

第一个参数是源图像，后面是分离出来每个通道的目标图像，如果原图像是3通道的，可以把最后一个参数设置为空。例如cvCvtPixToPlane（IplImage * src,IplImage * dst1,IplImage *dst2,IplImage * dst3,NULL)，NULL也可以写为0.

CreateHist
CreateHist

CvHistogram* cvCreateHist( int dims, int* sizes, int type,
float** ranges=NULL, int uniform=1 );
dims

sizes

type

ranges

uniform

GetMinMaxHistValue
GetMinMaxHistValue

void cvGetMinMaxHistValue( const CvHistogram* hist,
float* min_value, float* max_value,
int* min_idx=NULL, int* max_idx=NULL );
hist

min_value

max_value

min_idx

max_idx

QueryHistValue_1D
QueryHistValue_1D

#define cvQueryHistValue_1D( hist, idx0 ) \
cvGetReal1D( (hist)->bins, (idx0) )
#define cvQueryHistValue_2D( hist, idx0, idx1 ) \
cvGetReal2D( (hist)->bins, (idx0), (idx1) )
#define cvQueryHistValue_3D( hist, idx0, idx1, idx2 ) \
cvGetReal3D( (hist)->bins, (idx0), (idx1), (idx2) )
#define cvQueryHistValue_nD( hist, idx ) \
cvGetRealND( (hist)->bins, (idx) )
hist

idx0, idx1, idx2, idx3

idx

CalcHist
CalcHist

void cvCalcHist( IplImage** image, CvHistogram* hist,
int accumulate=0, const CvArr* mask=NULL );
image

hist

accumulate

Rectangle
Rectangle

void cvRectangle( CvArr* img, CvPoint pt1, CvPoint pt2, CvScalar color,
int thickness=1, int line_type=8, int shift=0 );
img

pt1

pt2

color

thickness

line_type

shift

----------------------------------------------------------------------------------------------
/*code*/
1. #include <highgui.h>
2. #include <cv.h>
3.
4. int main( int argc, char** argv )
5. {
6.     IplImage* src;
7.
8.     if( argc == 2 && ( src = cvLoadImage( argv[1], 1 ) ) != 0 )
9.     {
10.         IplImage* hsv = cvCreateImage( cvGetSize( src ), 8, 3 );
11.         cvCvtColor( src, hsv, CV_BGR2HSV );  //色彩空间的转换
12.
13.         //计算直方图，并将其分解为单通道
14.         IplImage* h_plane = cvCreateImage( cvGetSize( src ), 8, 1 );
15.         IplImage* s_plane = cvCreateImage( cvGetSize( src ), 8, 1 );
16.         IplImage* v_plane = cvCreateImage( cvGetSize( src ), 8, 1 );
17.         IplImage* planes[] = { h_plane, s_plane };
18.         cvCvtPixToPlane( hsv, h_plane, s_plane, v_plane, 0 );  //分割多通道数组成几个单通道数组或者从数组中提取一个通道,可以看作cvSplit是他的宏
19.
20.         //构建直方图，并计算直方图
21.         int h_bins = 30, s_bins = 20;
22.         CvHistogram* hist;
23.         {  //单独的模块
24.             int hist_size[] = { h_bins, s_bins }; //直方图矩阵大小
25.             float h_ranges[] = { 0, 180 };
26.             float s_ranges[] = { 0, 255 };
27.             float* ranges[] = { h_ranges, s_ranges };//二维数组
28.             hist = cvCreateHist( 2, hist_size, CV_HIST_ARRAY, ranges, 1 ); //创建直方图，参数是维度，矩阵大小，直方图的表示格式（CV_HIST_ARRAY 意味着直方图数据表示为多维密集数组 ），图中方块范围的数组
29.         };
30.         cvCalcHist( planes, hist, 0, 0 );  //计算图像image(s) 的直方图，planes是IplImage**类型
31.
32.         //创建图像来显示直方图
33.         int scale = 10;
34.         IplImage* hist_img = cvCreateImage( cvSize( h_bins * scale, s_bins * scale ), 8, 3 );
35.         cvZero( hist_img );
36.
37.         //填充
38.         float max_value = 0;
39.         cvGetMinMaxHistValue( hist, 0, &max_value, 0 );  //找到最大和最小直方块
40.
41.         forint h = 0; h < h_bins; h++ )  //遍历矩阵
42.         {
43.             forint s = 0; s < s_bins; s++ )
44.             {
45.                 float bin_val = cvQueryHistValue_2D( hist, h, s );  //查询二维直方块的值
46.                 int intensity = cvRound( bin_val * 255 );  //将输入浮点数转换为整数
47.                 cvRectangle( hist_img,
48.                     cvPoint( h * scale, s * scale ),
49.                     cvPoint( ( ( h+1 ) * scale - 1 ), ( ( s+1 ) * scale -  1 ) ),
50.                     CV_RGB( intensity, intensity, intensity ),
51.                     CV_FILLED
52.                     );  //绘制矩形,确定矩形对角线的两个点
53.             }
54.         }
55.         cvNamedWindow( "source", 1 );
56.         cvShowImage( "source", src );
57.         cvNamedWindow( "H-S Histogram", 1 );
58.         cvShowImage( "H-S Histogram", hist_img );
59.         cvWaitKey(0);
60.     }
61.
62.     return 0;
63. }
----------------------------------------------------------------------------------------------
/*result*/
source image
histogram image

posted on 2012-02-10 10:48  伪君  阅读(2631)  评论(0编辑  收藏  举报