OpenCV颜色直方图
#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颜色直方图的更多相关文章
- OpenCV 实现颜色直方图
颜色直方图是在许多图像检索系统中被广泛采用的颜色特征.它所描述的是不同色彩在整幅图像中所占的比例,而并不关心每种色彩所处的空间位置,即无法描述图像中的对象或物体.颜色直方图特别适于描述那些难以进行自动 ...
- OpenCV成长之路(5):图像直方图的应用
正如第4篇文章所说的图像直方图在特征提取方面有着很重要的作用,本文将举两个实际工程中非常实用的例子来说明图像直方图的应用. 一.直方图的反向映射. 我们以人脸检测举例,在人脸检测中,我们第一步往往需要 ...
- [OpenCV] Image Processing - Grayscale Transform
"每个像素的输出值只取决于其输入值" 重难点:Histogram equalization 参考:笑得很甜 http://blog.csdn.net/xiaowei_cqu/art ...
- 【转】opencv检测运动物体的基础_特征提取
特征提取是计算机视觉和图像处理中的一个概念.它指的是使用计算机提取图像信息,决定每个图像的点是否属于一个图像特征.特征提取的结果是把图像上的点分为不同的子集,这些子集往往属于孤立的点.连续的曲线或者连 ...
- OpenCV成长之路:图像直方图的应用
OpenCV成长之路:图像直方图的应用 2014-04-11 13:57:03 标签:opencv 图像 直方图 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否 ...
- OpenCV探索之路(二十八):Bag of Features(BoF)图像分类实践
在深度学习在图像识别任务上大放异彩之前,词袋模型Bag of Features一直是各类比赛的首选方法.首先我们先来回顾一下PASCAL VOC竞赛历年来的最好成绩来介绍物体分类算法的发展. 从上表我 ...
- opencv批处理提取图像的特征
____________________________________________________________________________________________________ ...
- [OpenCV-Python] OpenCV 中的图像处理 部分 IV (五)
部分 IVOpenCV 中的图像处理 OpenCV-Python 中文教程(搬运)目录 22 直方图 22.1 直方图的计算,绘制与分析目标 • 使用 OpenCV 或 Numpy 函数计算直方图 • ...
- [OpenCV] Image Processing - Grayscale Transform & Histogram
颜色直方图 首先,先介绍一些Hist的基本使用. Ref:[OpenCV]数字图像灰度直方图 官方文档:https://docs.opencv.org/trunk/d8/dbc/tutorial_hi ...
随机推荐
- JQuery------$.get()和$.post()传递数据的使用方法
菜鸟教程地址: http://www.runoob.com/jquery/jquery-ref-ajax.html html(../Home/Index.cshtml) <!DOCTYPE ht ...
- 9月26日JavaScript表单验证、正则表达
一.非空验证 trim:去空格(去掉前后的空格),任何字符串都可以用这个方法.写法为:if(v.trim().length==0),表示如果去掉空格后的字符串的长度为0. <body> & ...
- Linux下的网络环境配置
- LaTex数学符号
http://web.ift.uib.no/Teori/KURS/WRK/TeX/symALL.html
- yourphp读取不到hits
源代码 <YP:list name="Article" order="id desc" catid="37" limit=" ...
- mysql之用户授权
授权命令: 1.全部权限:grant all on *.* to user@192.168.10.2 identified by "pass": 2.部分权限:grant sele ...
- 数据库操作事务IsolationLevel 枚举
成员名称 说明 Chaos 无法覆盖隔离级别更高的事务中的挂起的更改. ReadCommitted 在正在读取数据时保持共享锁,以避免脏读,但是在事务结束之前可以更改数据,从而导致不可重复 ...
- AWK命令的用法
1.awk命令简介: awk是一种可以处理数据.产生格式化报表的语言,功能十分强大. awk的工作方式是读取数据,将每一行数据视为一条记录(record)每笔记录以字段分隔符分成若干字段,然后输出各个 ...
- centos 命令大全
文件操作: ls ####查看目录中的文件#### ls -F ####查看目录中的文件#### ls -l ####显示文件和目录的详细资料#### ls -a ...
- F5负载均衡的初识和基本配置
目前全球范围内应用比较广泛的负载均衡设备为美国的F5.F5于2000年底进驻中国,在国内业界,F5负载均衡产品已经成为了主流负载均衡技术的代名词.下面我们对F5负载均衡设备做一个基本介绍,方便大家去认 ...