我们在处理彩色图像时。特别是在做局部图像的阈值切割时,须要一个直观的RGB统计图。

  接下来開始实现。

   代码:

void CalcHistRGB()
{
IplImage* img_source; if (img_source = cvLoadImage("101.jpg",1))
{
IplImage* RedChannel = cvCreateImage( cvGetSize(img_source), 8, 1);
IplImage* GreenChannel = cvCreateImage( cvGetSize(img_source), 8, 1);
IplImage* BlueChannel = cvCreateImage( cvGetSize(img_source), 8, 1);
IplImage* alphaChannel = cvCreateImage( cvGetSize(img_source), 8, 1);
IplImage* gray_plane = cvCreateImage(cvGetSize(img_source),8,1); //切割为单通道图像
cvSplit(img_source,BlueChannel,GreenChannel,RedChannel,0);
// 显示图像
cvNamedWindow( "RedChannel", 1 );
cvNamedWindow( "GreenChannel", 1 );
cvNamedWindow( "BlueChannel", 1 );
cvNamedWindow( "lphaChannel", 1 ); cvShowImage( "RedChannel", RedChannel );
cvShowImage( "GreenChannel", GreenChannel );
cvShowImage( "BlueChannel", BlueChannel );
cvShowImage( "lphaChannel", alphaChannel ); cvCvtColor(img_source,gray_plane,CV_BGR2GRAY);
cvNamedWindow("GrayPlane",1);
cvShowImage("GrayPlane",gray_plane);
//OpenCV中无论是Windows中Load的还是摄像头取得的都是BGR顺序排列的 //然后为这四幅图创建相应的直方图结构。
int hist_size = 100; int hist_height = 100; float range[] = {0,255}; float* ranges[]={range}; CvHistogram* r_hist = cvCreateHist(1,&hist_size,CV_HIST_ARRAY,ranges,1); CvHistogram* g_hist = cvCreateHist(1,&hist_size,CV_HIST_ARRAY,ranges,1); CvHistogram* b_hist = cvCreateHist(1,&hist_size,CV_HIST_ARRAY,ranges,1); CvHistogram* gray_hist = cvCreateHist(1,&hist_size,CV_HIST_ARRAY,ranges,1); //接下来计算直方图,创建用于显示直方图的图像,略去了一部分反复代码,下面也是 cvCalcHist(&RedChannel,r_hist,0,0);
cvCalcHist(&GreenChannel,g_hist,0,0);
cvCalcHist(&BlueChannel,b_hist,0,0);
cvCalcHist(&gray_plane,gray_hist,0,0);
cvNormalizeHist(gray_hist,1.0);
cvNormalizeHist(r_hist,1.0);
cvNormalizeHist(g_hist,1.0);
cvNormalizeHist(b_hist,1.0); int scale = 2; IplImage* hist_image = cvCreateImage(cvSize(hist_size*scale,hist_height*4),8,3); cvZero(hist_image); //然后開始显示,这里对直方图进行了标准化处理。不然的话无法观察到明显的变化。 float r_max_value = 0;
float g_max_value = 0;
float b_max_value = 0;
float gray_max_value = 0;
cvGetMinMaxHistValue(r_hist, 0,&r_max_value,0,0);
cvGetMinMaxHistValue(g_hist, 0,&g_max_value,0,0);
cvGetMinMaxHistValue(b_hist, 0,&b_max_value,0,0);
cvGetMinMaxHistValue(b_hist, 0,&gray_max_value,0,0);
for(int i=0;i<hist_size;i++)
{ float r_bin_val = cvQueryHistValue_1D(r_hist,i); int r_intensity = cvRound(r_bin_val*hist_height/r_max_value);
cvRectangle(
hist_image,
cvPoint(i*scale,hist_height-1),
cvPoint((i+1)*scale - 1, hist_height - r_intensity),
CV_RGB(255,0,0)); float g_bin_val=cvQueryHistValue_1D(g_hist,i);
int g_intensity = cvRound(g_bin_val*hist_height/g_max_value);
cvRectangle(
hist_image,
cvPoint(i*scale,2*hist_height-1),
cvPoint((i+1)*scale - 1, 2*hist_height - g_intensity),
CV_RGB(0,255,0)); float b_bin_val = cvQueryHistValue_1D(b_hist,i);
int b_intensity = cvRound(b_bin_val*hist_height/b_max_value);
cvRectangle(
hist_image,
cvPoint(i*scale,3*hist_height-1),
cvPoint((i+1)*scale - 1, 3*hist_height - b_intensity),
CV_RGB(0,0,255)); float gray_bin_val = cvQueryHistValue_1D(gray_hist,i);
int gray_intensity = cvRound(gray_bin_val*hist_height/gray_max_value);
cvRectangle(
hist_image,
cvPoint(i*scale,4*hist_height-1),
cvPoint((i+1)*scale - 1, 4*hist_height - gray_intensity),
CV_RGB(100,100,100)); }
cvNamedWindow( "Source", 1 );
cvShowImage( "Source", img_source ); cvNamedWindow( "RGB_Histogram", 1 );
cvShowImage( "RGB_Histogram", hist_image ); } }

计算结果例如以下:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3VuYm95aXJpcw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />

   

OpenCV编程->RGB直方图统计的更多相关文章

  1. OpenCV手工实现灰度及RGB直方图

    手工实现灰度及RGB直方图 !库 1. 灰度图像直方图 算法 1. 图片灰度化: 2. 遍历Mat,统计各灰度级的像素个数: 3. 根据opencv画点线函数,绘制坐标轴及像素分布图 源码(编译环境: ...

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

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

  3. OpenCV(7)-图像直方图

    直方图定义可参考这里.图像的直方图用来表示图像像素的统计信息,它统计了图像每一个通道(如果是多通道)中,每个像素的个数(比例). 计算直方图 OpenCV提供了直接计算直方图的函数 void calc ...

  4. OpenCV 编程简单介绍(矩阵/图像/视频的基本读写操作)

    PS. 因为csdn博客文章长度有限制,本文有部分内容被截掉了.在OpenCV中文站点的wiki上有可读性更好.而且是完整的版本号,欢迎浏览. OpenCV Wiki :<OpenCV 编程简单 ...

  5. opencv编程入门技巧

    opencv编程入门技巧 最近在项目中负责图像处理模块的编程工作,主要分为两个板块,一是视频图像去雾,二是可视.红外图像融合.为了提升开发效率,遂开始学习并使用opencv图像类库,效果很好的说~因为 ...

  6. OpenCV学习(24) 直方图(1)

    直方图是对数据的统计,并将统计结果分布于一系列预定义的槽中.这里的数据不仅仅指的是灰度值,它可以是任何能有效描述图像特征的数据,比如图像梯度等等. 假设有一个矩阵包含一张图像的信息 (灰度值 0-25 ...

  7. OpenCV实现灰度直方图和直方图拉伸

    原文链接:http://blog.csdn.net/xiaowei_cqu/article/details/7600666 如有疑问或者版权问题,请移步原作者或者告知本人. 灰度直方图是数字图像中最简 ...

  8. Opencv中RGB通道/HSV通道并分离

    OpenCV中HSV颜色模型及颜色分量范围 opencv HSV 颜色模型(H通道取值 && CV_BGR2HSV_FULL) [opencv]在hsv颜色空间识别区域颜色 将原图分离 ...

  9. 基于Modelsim的直方图统计算法仿真

    一.前言 本篇主要针对牟新刚编著<基于FPGA的数字图像处理及应用>第六章第五节中直方图统计相关类容进行总结,包括代码实现及 基于Modelsim的仿真.书读百遍,其意自现. 2020-0 ...

随机推荐

  1. 4. 使用别的json解析框架【从零开始学Spring Boot】

    转载:http://blog.csdn.net/linxingliang/article/details/51585921 此文章已经废弃,请看新版的博客的完美解决方案: 78. Spring Boo ...

  2. 怎么运行Typescript

    依据官方示例: npm i -g typescript 示例:tsc *.ts 实例:tsc hello.ts 不过以上实现的太有限制了,如下实现可满足正常测试以及学习使用 package,json ...

  3. ACM-百度之星资格赛之Labyrinth——hdu4826

    Labyrinth Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  4. [经验总结]material design效果与开发总结

    首先贴一个參考过的文章,写的不错: 在低版本号android系统上实现Material design应用 以下是工作中总结出来的,列出了在<5.0的设备是怎样实现material design的 ...

  5. cmd命令速查手册

    CMD命令速查手册ASSOC显示或修改文件扩展名关联AT 计划在计算机上运行的命令和程序ATTRIB 显示或更改文件属性BREAK 设置或清除扩展式 CTRL+C检查CACLS显示或修改文件的访问控制 ...

  6. msyql5.5修改配置文件开启慢查询日志

    修改/etc/my.cnf文件 在[mysqld]下面修改或添加配置(在别处不起作用) slow_query_log = on slow_query_log_file = /usr/local/mys ...

  7. c#通过URL地址从服务器上下载文件

  8. Mac下安装LNMP(Nginx+PHP5.6)环境(转)

    安装Homebrew 最近工作环境切换到Mac,所以以OS X Yosemite(10.10.1)为例,记录一下从零开始安装Mac下LNMP环境的过程 确保系统已经安装xcode,然后使用一行命令安装 ...

  9. Struts2学习之拦截器栈

    © 版权声明:本文为博主原创文章,转载请注明出处 拦截器栈: - 从结构上看:拦截器栈相当于多个拦截器的组合 - 从功能上看:拦截器栈也是拦截器 默认拦截器栈: - 在struts-core.jar中 ...

  10. Atitit.jdk java8的语法特性详解 attilax 总结

    Atitit.jdk java8的语法特性详解 attilax 总结 1.1. 类型推断这个特别有趣的.鲜为人知的特性1 2. Lambda1 2.1. 内部迭代意味着改由Java类库来进行迭代,而不 ...