#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. win10系统点击关机按钮后无法关机的解决办法

    先吐槽下:我越发的发现我现在成了修电脑的了,我的职位是linux运维,现在干的活很蛋疼,公司只有我一个运维,修电脑.搞网络.抬服务器.弄监控,搭环境.搞自动化发布.弄虚拟化都我一个人哇.好了,打住. ...

  2. Fragment碎片的创建和动态更新

    Fragment,在平板应用中较为参见,把视图分为两个甚至多个模块. 一,一个简单的fragment 1.创建两个局部文件,用于等待被调用 (1)left_fragment (2)right_frag ...

  3. UnExpected Error, Quitting

    UnExpected Error, Quitting VB在win7 环境安装后,启动vb6.0弹出以上英文提示,目前解决方法: 下载动态库,放置于C:\ProgramFiles\Common Fil ...

  4. ElasticSearch之一——索引

    ElasticSearch索引 ElasticSearch 是一个分布式可扩展的实时搜索引擎,它建立在开源搜索引擎框架Apache Lucene基础上.ElasticSearch 不但包括了全文搜索功 ...

  5. Linux下显示ip所属位置

    在linux下,要是网络出现延迟,通常我们需要分析自己到对端的服务器的网络环境 例:ping www.baidu.com traceroute www.baidu.com 通过分析来确定大概是什么问题 ...

  6. PHP任意文件包含绕过截断新姿势

    前言 此方法是@l3m0n叔叔给我分享的,原文已经发布在90sec 我没有90sec的账号,所以自己实践一下,顺道安利给访问我博客的小伙伴. 适用情况 可以控制协议的情况下,如果%00无法截断包含,可 ...

  7. Redis-cluster集群【第二篇】:redis持久化

    Redis持久化原理: Redis支持两种持久化:RDB和AOF模式 一.名词解释: RDB:持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot).AOF ...

  8. Css常用收集

    /*-------------------------------------- 圆角*/ -webkit-border-radius: 4px;  -moz-border-radius: 4px; ...

  9. zabbix安装全过程

    在了解<zabbix硬件.软件需求>之后,在你心里应该有备选的机器.今天开始安装zabbix.zabbix需要LNMP或者LAMP环境.环境的搭建不在本章范围内. LNMP环境配置Linu ...

  10. Quartz-2D

    Quartz 2D是一个二维图形绘制引擎,支持iOS环境和Mac OS X环境.我们可以使用Quartz 2D API来实现许多功能,如基本路径的绘制.透明度.描影.绘制阴影.透明层.颜色管理.反锯齿 ...