示例程序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;
   
}

 

运行结果:

H-S二维直方图:

示例程序015--HSV或RGB二维直方图 

R-G二维直方图:
示例程序015--HSV或RGB二维直方图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值