opencv相關問題理解(4)直方圖操作!!

分割通道方法:應用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;
}

發佈了28 篇原創文章 · 獲贊 1 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章