您的位置:首页 > 运维架构

opencv相关问题理解(4)直方图操作!!

2010-01-26 11:06 369 查看
分割通道方法:应用split函数
void cvSplit( const CvArr* src, CvArr* dst0, CvArr* dst1,
CvArr* dst2, CvArr* dst3 );
等同于cvCvtPixToPlane。
典型直方图求法
#include "stdafx.h"
#include <cv.h>
#include <highgui.h>
int main(int argc, char** argv)
{
IplImage *src=cvLoadImage("./lena.jpg");
IplImage *hsv=cvCreateImage(cvGetSize(src),src->depth,3);
cvCvtColor(src,hsv,CV_BGR2HSV);//把原来图像BGR空间转换成HSV空间
IplImage *dst_h=cvCreateImage(cvGetSize(src),src->depth,1);
IplImage *dst_s=cvCreateImage(cvGetSize(src),src->depth,1);
IplImage *dst_v=cvCreateImage(cvGetSize(src),src->depth,1);
IplImage *planes[]={dst_h,dst_s};
cvSplit(hsv,dst_h,dst_s,dst_v,NULL);
int h_bins=30,s_bins=32;

CvHistogram *Hist_hsv;
{
int hist_size[]={h_bins,s_bins};
float h_ranges[]={0,180};
float s_ranges[]={0,255};
float *ranges[]={h_ranges,s_ranges};
Hist_hsv=cvCreateHist(2,hist_size,CV_HIST_ARRAY,ranges,1);
}
cvCalcHist(planes,Hist_hsv,0,0);
//cvNormalizeHist(hist[i],1.0);
int scale=10;
IplImage *hist_img=cvCreateImage(cvSize(h_bins*scale,s_bins*scale),
8,
3
);
cvZero(hist_img);
float max_value = 0;
cvGetMinMaxHistValue( Hist_hsv, 0, &max_value, 0, 0 );
for( int h = 0; h < h_bins; h++ ) {

for( int s = 0; s < s_bins; s++ ) {
float bin_val = cvQueryHistValue_2D( Hist_hsv, h, s );
int intensity = cvRound( bin_val * 255 / 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
);
}
}
cvNamedWindow("./lena.jpg");
cvShowImage("./lena.jpg",src);

cvNamedWindow("dst");
cvShowImage("dst",hist_img);

cvWaitKey();
cvReleaseImage(&src);
cvDestroyWindow("./lena.jpg");
cvReleaseImage(&hist_img);
cvDestroyWindow("dst");

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: