#include "stdafx.h"

void myShowHist(IplImage* image1,IplImage* image2);
IplImage* cvShowHist(IplImage* src); int main()
{
//对彩色图像进行均衡化 IplImage * image= cvLoadImage("E:\\C_VC_code\\Text_Photo\\girl004.jpg");
IplImage* eqlimage=cvCreateImage(cvGetSize(image),image->depth,); //信道分离
IplImage* redImage=cvCreateImage(cvGetSize(image),image->depth,);
IplImage* greenImage=cvCreateImage(cvGetSize(image),image->depth,);
IplImage* blueImage=cvCreateImage(cvGetSize(image),image->depth,); cvSplit(image,blueImage,greenImage,redImage,NULL);//用 cvSplit 函数分解图像到单个色彩通道上 /*
cvNamedWindow("red",CV_WINDOW_AUTOSIZE);
cvNamedWindow("green",CV_WINDOW_AUTOSIZE);
cvNamedWindow("blue",CV_WINDOW_AUTOSIZE); cvShowImage("red",redImage);
cvShowImage("green",greenImage);
cvShowImage("blue",blueImage);
*/ //cvEqualizeHist()是适用于灰度图象直方图均衡化,所以必须先将图片分解到单通道上
//分别均衡化每个信道
cvEqualizeHist(redImage,redImage);
cvEqualizeHist(greenImage,greenImage);
cvEqualizeHist(blueImage,blueImage); /*
cvNamedWindow("red2",CV_WINDOW_AUTOSIZE);
cvNamedWindow("green2",CV_WINDOW_AUTOSIZE);
cvNamedWindow("blue2",CV_WINDOW_AUTOSIZE); cvShowImage("red2",redImage);
cvShowImage("green2",greenImage);
cvShowImage("blue2",blueImage);
*/ //信道合并
cvMerge(blueImage,greenImage,redImage,NULL,eqlimage); //显示图片和直方图
cvNamedWindow( "source", );
cvShowImage("source",image); cvNamedWindow( "Equalized", );
cvShowImage("Equalized",eqlimage);
cvSaveImage("equalized.jpg",eqlimage); myShowHist(image,eqlimage); cvWaitKey(); cvDestroyWindow("source");
cvDestroyWindow("result");
cvReleaseImage( &image );
cvReleaseImage( &eqlimage ); } void myShowHist(IplImage* image1,IplImage* image2)
{
IplImage* hist_image1=cvShowHist(image1);
IplImage* hist_image2=cvShowHist(image2); cvNamedWindow( "H-S Histogram1", );
cvShowImage( "H-S Histogram1", hist_image1 ); cvNamedWindow( "H-S Histogram2", );
cvShowImage( "H-S Histogram2", hist_image2 ); cvSaveImage("Histogram1.jpg",hist_image1);
cvSaveImage("Histogram2.jpg",hist_image2);
} IplImage* cvShowHist(IplImage* src)
{
IplImage* hsv = cvCreateImage( cvGetSize(src), , );
IplImage* h_plane = cvCreateImage( cvGetSize(src), , );
IplImage* s_plane = cvCreateImage( cvGetSize(src), , );
IplImage* v_plane = cvCreateImage( cvGetSize(src), , );
IplImage* planes[] = { h_plane, s_plane }; /** H 分量划分为16个等级,S分量划分为8个等级 */
int h_bins = , s_bins = ;
int hist_size[] = {h_bins, s_bins}; /** H 分量的变化范围 */
float h_ranges[] = { , }; /** S 分量的变化范围*/
float s_ranges[] = { , };
float* ranges[] = { h_ranges, s_ranges }; /** 输入图像转换到HSV颜色空间 */
cvCvtColor( src, hsv, CV_BGR2HSV );
cvCvtPixToPlane( hsv, h_plane, s_plane, v_plane, ); /** 创建直方图,二维, 每个维度上均分 */
CvHistogram * hist = cvCreateHist( , hist_size, CV_HIST_ARRAY, ranges, );
/** 根据H,S两个平面数据统计直方图 */
cvCalcHist( planes, hist, , ); /** 获取直方图统计的最大值,用于动态显示直方图 */
float max_value;
cvGetMinMaxHistValue( hist, , &max_value, , ); /** 设置直方图显示图像 */
int height = ;
int width = (h_bins*s_bins*);
IplImage* hist_img = cvCreateImage( cvSize(width,height), , );
cvZero( hist_img ); /** 用来进行HSV到RGB颜色转换的临时单位图像 */
IplImage * hsv_color = cvCreateImage(cvSize(,),,);
IplImage * rgb_color = cvCreateImage(cvSize(,),,);
int bin_w = width / (h_bins * s_bins);
for(int h = ; h < h_bins; h++)
{
for(int s = ; 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); /** 获得当前直方图代表的颜色,转换成RGB用于绘制 */
cvSet2D(hsv_color,,,cvScalar(h*.f / h_bins,s*.f/s_bins,,));
cvCvtColor(hsv_color,rgb_color,CV_HSV2BGR);
CvScalar color = cvGet2D(rgb_color,,); cvRectangle( hist_img, cvPoint(i*bin_w,height),
cvPoint((i+)*bin_w,height - intensity),
color, -, , );
}
} return hist_img; }

OpenCV颜色直方图的更多相关文章

  1. OpenCV 实现颜色直方图

    颜色直方图是在许多图像检索系统中被广泛采用的颜色特征.它所描述的是不同色彩在整幅图像中所占的比例,而并不关心每种色彩所处的空间位置,即无法描述图像中的对象或物体.颜色直方图特别适于描述那些难以进行自动 ...

  2. OpenCV成长之路(5):图像直方图的应用

    正如第4篇文章所说的图像直方图在特征提取方面有着很重要的作用,本文将举两个实际工程中非常实用的例子来说明图像直方图的应用. 一.直方图的反向映射. 我们以人脸检测举例,在人脸检测中,我们第一步往往需要 ...

  3. [OpenCV] Image Processing - Grayscale Transform

    "每个像素的输出值只取决于其输入值" 重难点:Histogram equalization 参考:笑得很甜 http://blog.csdn.net/xiaowei_cqu/art ...

  4. 【转】opencv检测运动物体的基础_特征提取

    特征提取是计算机视觉和图像处理中的一个概念.它指的是使用计算机提取图像信息,决定每个图像的点是否属于一个图像特征.特征提取的结果是把图像上的点分为不同的子集,这些子集往往属于孤立的点.连续的曲线或者连 ...

  5. OpenCV成长之路:图像直方图的应用

    OpenCV成长之路:图像直方图的应用 2014-04-11 13:57:03 标签:opencv 图像 直方图 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否 ...

  6. OpenCV探索之路(二十八):Bag of Features(BoF)图像分类实践

    在深度学习在图像识别任务上大放异彩之前,词袋模型Bag of Features一直是各类比赛的首选方法.首先我们先来回顾一下PASCAL VOC竞赛历年来的最好成绩来介绍物体分类算法的发展. 从上表我 ...

  7. opencv批处理提取图像的特征

    ____________________________________________________________________________________________________ ...

  8. [OpenCV-Python] OpenCV 中的图像处理 部分 IV (五)

    部分 IVOpenCV 中的图像处理 OpenCV-Python 中文教程(搬运)目录 22 直方图 22.1 直方图的计算,绘制与分析目标 • 使用 OpenCV 或 Numpy 函数计算直方图 • ...

  9. [OpenCV] Image Processing - Grayscale Transform & Histogram

    颜色直方图 首先,先介绍一些Hist的基本使用. Ref:[OpenCV]数字图像灰度直方图 官方文档:https://docs.opencv.org/trunk/d8/dbc/tutorial_hi ...

随机推荐

  1. JavaWeb学习笔记——表达式语言

    使用表达式语言,可以方便地访问标志位(JSP中有page(pageContext).request.session和application4种标志位)中的属性内容,可以避免出现许多的Scriptlet ...

  2. C#----对时间结构DateTime的使用(时间日期的使用)

    1.其初始化时间是0001--0--0 0:0:0 class Program { DateTime dt; static void Main(string[] args) { Program pp ...

  3. IOS下自定义click事件使用alert引发的血案

    使用过iscroll插件的同学都知道iscroll支持自定义事件,即在调用iscroll时参数赋值options.click = true. 接下来定义事件如: $clinicAppoint.on(' ...

  4. C++ Pointer-to-Member Selector

    http://www.codeguru.com/cpp/cpp/article.php/c17401/C-Tutorial-PointertoMember-Function.htm https://m ...

  5. thinkphp查询

    public function index(){ $result = M('content')->select() $this->assig('result',$result); $thi ...

  6. Hibernate.lock()方法中各种锁的区别

    悲观锁 它指的是对数据被外界修改持保守态度.假定任何时刻存取数据时,都可能有另一个客户也正在存取同一笔数据,为了保持数据被操作的一致性,于是对数据采取了数据库层次的锁定状态,依靠数据库提供的锁机制来实 ...

  7. Python 线程、进程和协程

    python提供了两个模块来实现多线程thread 和threading ,thread 有一些缺点,在threading 得到了弥补,为了不浪费时间,所以我们直接学习threading 就可以了. ...

  8. Python之路【第四篇补充】:面向对象初识和总结回顾

    面向过程的编程 面向过程:根据业务逻辑从上到下写垒代码! 例子: 需求一.有一个程序需要做身份认证: 用户名有个字典: #定义一个用户名信息字典 user_info = { "zhangsa ...

  9. Orchard源码分析(4.2):Orchard.Logging.LoggingModule类

    与CollectionOrderModule一样,LoggingModule也是一个Autofac模块.它以属性注入的方式给需要日志服务的对象设置Logger.    如果一个类有Orchard.Lo ...

  10. 【8-21】java学习笔记03

    内部类(静态内部类&非静态内部类) 静态外部类成员方法(如main方法)不能直接访问内部类,但是可以通过外部类的方法,在其中创建内部类实例对象,间接使用: 非静态内部类可以直接访问外部类的私有 ...