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;
}
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;
}
相关文章推荐
- 字符串相关操作、问题及算法提纲
- VS2012下配置opencv 及相关问题
- VS2010调用OpenCV的相关配置问题
- OpenCV学习笔记(十) 直方图操作
- C#线程相关问题总结:基本操作及UI控件交互
- QT_openCV2.4.9或相关版本编译正常,运行时提示“程序异常结束”问题分析
- ESXi(ESXi 4.1)相关问题解决方法和操作学习笔记
- 第四十一篇:opencv中相关的训练的问题解答(经典)
- 指针与数组相关问题的理解
- opencv中直方图的理解
- Java功底篇系列-02-如何理解实际开发中与“排序”相关的问题
- OpenCV视频处理相关问题及解决方法
- android混淆操作及相关问题
- hive2.1.1相关操作及问题汇总
- Linux 环境变量设置问题及与Oracle的相关操作
- 关于Ubuntu16.04安装opencv2.4.13及编译运行opencv程序的相关问题
- Opencv:IplImage转换为bmp的过程及相关问题
- Java多线程操作相关问题总结
- EntityFrameworkCode 操作MySql 相关问题
- Android 图片文件操作、屏幕相关、.9图片的理解