学习OpenCV——绘制彩色直方图(HSV2BGR)

#include <cv.h>
#include <highgui.h>
#include <iostream>
using namespace std;

int main( int argc, char** argv )
{
    IplImage * src= cvLoadImage("D:/2.jpg");

    IplImage* hsv = cvCreateImage( cvGetSize(src), 8, 3 );
    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 };

    /** H 分量划分为16个等级,S分量划分为8个等级 */
    int h_bins = 16, s_bins = 8;
    int hist_size[] = {h_bins, s_bins};

    /** H 分量的变化范围 */
    float h_ranges[] = { 0, 180 }; 

    /** S 分量的变化范围*/
    float s_ranges[] = { 0, 255 };
    float* ranges[] = { h_ranges, s_ranges };

    /** 输入图像转换到HSV颜色空间 */
    cvCvtColor( src, hsv, CV_BGR2HSV );
    cvCvtPixToPlane( hsv, h_plane, s_plane, v_plane, 0 );

    /** 创建直方图,二维, 每个维度上均分 */
    CvHistogram * hist = cvCreateHist( 2, hist_size, CV_HIST_ARRAY, ranges, 1 );
    /** 根据H,S两个平面数据统计直方图 */
    cvCalcHist( planes, hist, 0, 0 );

    /** 获取直方图统计的最大值,用于动态显示直方图 */
    float max_value;
    cvGetMinMaxHistValue( hist, 0, &max_value, 0, 0 );

    /** 设置直方图显示图像 */
    int height = 240;
    int width = (h_bins*s_bins*6);
    IplImage* hist_img = cvCreateImage( cvSize(width,height), 8, 3 );
    cvZero( hist_img );

    /** 用来进行HSV到RGB颜色转换的临时单位图像 */
    IplImage * hsv_color = cvCreateImage(cvSize(1,1),8,3);
    IplImage * rgb_color = cvCreateImage(cvSize(1,1),8,3);
    int bin_w = width / (h_bins * s_bins);
    for(int h = 0; h < h_bins; h++)
    {
        for(int s = 0; s < s_bins; s++)
        {
            int i = h*s_bins + s;
            /** 获得直方图中的统计次数,计算显示在图像中的高度 */
            float bin_val = cvQueryHistValue_2D( hist, h, s );
            int intensity = cvRound(bin_val*height/max_value);//Round, Floor, Ceil 转换浮点数为整数(cvRound 返回和参数最接近的整数值。 cvFloor 返回不大于参数的最大整数值。cvCeil 返回不小于参数的最小整数值。)

            /** 获得当前直方图代表的颜色,转换成RGB用于绘制 */
            cvSet2D(hsv_color,0,0,cvScalar(h*180.f / h_bins,s*255.f/s_bins,255,0));
            cvCvtColor(hsv_color,rgb_color,CV_HSV2BGR);
            CvScalar color = cvGet2D(rgb_color,0,0);

            cvRectangle( hist_img, cvPoint(i*bin_w,height),
                cvPoint((i+1)*bin_w,height - intensity),
                color, -1, 8, 0 );
        }
    }

    cvNamedWindow( "Source", 1 );
    cvShowImage( "Source", src );

    cvNamedWindow( "H-S Histogram", 1 );
    cvShowImage( "H-S Histogram", hist_img );

    cvWaitKey(0);
}

from: http://blog.csdn.net/yangtrees/article/details/7433598

时间: 2024-10-11 01:56:32

学习OpenCV——绘制彩色直方图(HSV2BGR)的相关文章

【从零学习openCV】IOS7人脸识别实战

前言 接着上篇<IOS7下的人脸检測>,我们顺藤摸瓜的学习怎样在IOS7下用openCV的进行人脸识别,实际上非常easy,因为人脸检測部分已经完毕,剩下的无非调用openCV的方法对採集到的人脸样本进行训练,终于得到一个能够预測人脸的模型.可是当中的原理可谓是博大精深,因为快临最近末考试了,没时间去琢磨当中详细的细节,这次就先写个大概的demo,下次更新文章就得到6月20号之后了. 原理: 从OpenCV2.4之后,openCV增加了新的类FaceRecognizer,我们能够使用它便捷地进

《学习opencv》笔记——矩阵和图像操作——cvCrossProduct and cvCvtColor

矩阵和图像的操作 (1)cvCrossProduct函数 其结构 void cvCrossProdust(//计算两个三维向量的叉积 const CvArr* src1, const CvArr* src2, CvArr* dst ); 实例代码 #include <cv.h> #include <highgui.h> #include <stdio.h> #include <iostream> using namespace std; int main()

怎么样用opencv将彩色图片转化成像素值只有0和255的灰度图?

  分类: OpenCV [Q1]怎么样用opencv将彩色图片转化成像素值只有0和255的灰度图? 进行灰度化,IplImage* pImg = cvLoadImage( "C:\\1.bmp", 0 ); 这样图像已经灰度化,然后调用cvThreshold(image, image, 125, 255, CV_THRESH_BINARY); 就可以了,125那里是你所用的阈值,这就是最简单的二值化,你要用ostu,或者别的高级一点的,就要自己写函数了   // Truncate v

怎么用ChemDraw 15.1 Pro绘制彩色结构

ChemOffice 15是最新的ChemDraw化学工具套件,合理的使用这套软件可以大幅度的提高研究人员的工作效率.也有一些化学老师使用这套化学绘图软件教学,其可以绘制彩色结构有效增强教案说服力并吸引学生注意力,下面我们就来给大家介绍介绍怎么用ChemDraw 15.1 Pro绘制彩色结构? 原文:http://www.chemdraw.com.cn/ruheshiyong/caise-jigou.html 在使用ChemDraw 15.1 Pro绘制化学结构的过程中,增强趣味性的方法包括增加

学习Opencv 2.4.9(二) ---操作像素

作者:咕唧咕唧liukun321 来自:http://blog.csdn.net/liukun321 本质上说一张图像就是由数值组成的矩阵.Opencv 2.x由 cv::Mat 这个数据结构来表示一张图像.矩阵的每一个元素代表了一个像素.对于彩色图像而言矩阵的元素是一个三元数.对图像有了这个新的认识,下面可以试着借助opencv处理图像了. 先来看一下今天要处理的图像: 今天的主题是存取像素,首先来看一下如何存取像素值.其实对于像素值的操作都可以由cv::Mat类中成员直接或间接实现,cv::

《学习opencv》笔记——关于一些绘图的函数

绘图函数 (1)直线cvLine函数 其结构 void cvLine(//画直线 CvArr* array,//画布图像 CvPoint pt1,//起始点 CvPoint pt2,//终点 CvScalar color,//颜色 int thickness = 1,//宽度 int connectivity = 8//反走样 ); 实例代码 #include <cv.h> #include <highgui.h> #include <stdio.h> int main

【数字图像处理】四.MFC对话框绘制灰度直方图

本文主要讲述基于VC++6.0 MFC图像处理的应用知识,主要结合自己大三所学课程<数字图像处理>及课件进行回忆讲解,主要通过MFC单文档视图实现点击弹出对话框绘制BMP图片的灰度直方图,再获取平均灰度.中指灰度和标准差等值.文章比较详细基础,希望该篇文章对你有所帮助~ [数字图像处理]一.MFC详解显示BMP格式图片 [数字图像处理]二.MFC单文档分割窗口显示图片 [数字图像处理]三.MFC实现图像灰度.采样和量化功能详解 免费资源下载地址: http://download.csdn.ne

【图像处理】利用C++编写函数,绘制灰度图像直方图

1. 简介 利用OpenCV读取图像,转换为灰度图像,绘制该灰度图像直方图.点击直方图,控制台输出该灰度级像素个数. 2. 原理 (1) 实现原理较为简单,主要利用了OpenCV读取图像,并转换为灰度图像: srcImg = imread(" ......"); // “....” 代表图像地址 if (srcImg.empty()) { return -1; } imshow(WINDOW_SRCIMG, srcImg); Mat grayImg; cvtColor(srcImg,

学习Opencv 2.4.9 (一)---Opencv + vs2012环境配置

作者:咕唧咕唧liukun321 来自:http://blog.csdn.net/liukun321 首先获得最新的Opencv 2.4.9源码:opencv源码下载 一.Opencv环境变量配置 1.将源码安装到制定目录: 2.为Opencv 添加环境变量:计算机-->属性 点击高级系统设置 3.出来系统属性对话框后,点击环境变量. 4.弹出如下对话框:选中PATH 单击新建 5.点击新建添加环境变量 6.将opencv2.4.9变量包含到PATH中去 二.然后再看VS2012 的配置. 1.