OpenCV入门(二十一)-- 绘制彩色图像的直方图

2024-04-02 10:18

本文主要是介绍OpenCV入门(二十一)-- 绘制彩色图像的直方图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文中的代码大多来源于:

http://wiki.opencv.org.cn/index.php/%E5%9B%BE%E5%83%8F%E9%A2%9C%E8%89%B2%E5%88%86%E5%B8%83%E7%9B%B4%E6%96%B9%E5%9B%BE

颜色直方图的一些概念       

颜色直方图可以是基于不同的颜色空间坐标系。最常用的颜色空间是RGB颜色空间,原因在于大部分的数字图像都是用这种颜色空间表达的。然而,RGB空间结构并不符合人们对颜色相似性的主观判断。因此,有人提出了基于HSV空间、Luv空间和Lab空间的颜色直方图,因为它们更接近于人们对颜色的主观认识。其中HSV空间是直方图最常用的颜色空间。它的三个分量分别代表色彩(Hue)、饱和度(Saturation)和值(Value)。

HSV
HSV颜色空间:HSV(hue,saturation,value)颜色空间的模型对应于圆柱坐标系中的一个圆锥形子集,圆锥的顶面对应于V=1. 它包含RGB模型中的R=1,G=1,B=1 三个面,所代表的颜色较亮。色彩H由绕V轴的旋转角给定。红色对应于 角度0° ,绿色对应于角度120°,蓝色对应于角度240°。在HSV颜色模型中,每一种颜色和它的补色相差180° 。饱和度S取值从0到1,所以圆锥顶面的半径为1。HSV颜色模型所代表的颜色域是CIE色度图的一个子集,这个 模型中饱和度为百分之百的颜色,其纯度一般小于百分之百。在圆锥的顶点(即原点)处,V=0,H和S无定义, 代表黑色。圆锥的顶面中心处S=0,V=1,H无定义,代表白色。从该点到原点代表亮度渐暗的灰色,即具有不同 灰度的灰色。对于这些点,S=0,H的值无定义。可以说,HSV模型中的V轴对应于RGB颜色空间中的主对角线。 在圆锥顶面的圆周上的颜色,V=1,S=1,这种颜色是纯色。HSV模型对应于画家配色的方法。画家用改变色浓和色深的方法从某种纯色获得不同色调的颜色,在一种纯色中加入白色以改变色浓,加入黑色以改变色深,同时 加入不同比例的白色,黑色即可获得各种不同的色调。

http://baike.baidu.com/item/%E9%A2%9C%E8%89%B2%E7%9B%B4%E6%96%B9%E5%9B%BE?fr=aladdin


HSV颜色模型

HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。
这个模型中颜色的参数分别是:色调(H),饱和度(S),亮度(V)。

色调H
用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°;

饱和度S
取值范围为0.0~1.0,值越大,颜色越饱和。
亮度V
取值范围为0.0(黑色)~1.0(白色)。


RGB和CMY颜色模型都是面向硬件的,而HSV(Hue Saturation Value)颜色模型是面向用户的。
HSV模型的三维表示从RGB立方体演化而来。设想从RGB沿立方体对角线的白色顶点向黑色顶点观察,就可以看到立方体的六边形外形。六边形边界表示色彩,水平轴表示纯度,明度沿垂直轴测量。

http://baike.baidu.com/subview/541362/8445478.htm?from_id=12630604&type=syn&fromtitle=HSV%E9%A2%9C%E8%89%B2%E7%A9%BA%E9%97%B4&fr=aladdin



代码:绘制lena图像的直方图

#include "highgui.h"
#include "cv.h"
#include<iostream>using namespace std;void doHistDraw(IplImage* img)
{IplImage* hsv = cvCreateImage(cvGetSize(img), 8, 3);IplImage* h_plane = cvCreateImage(cvGetSize(img), 8, 1);IplImage* s_plane = cvCreateImage(cvGetSize(img), 8, 1);IplImage* v_plane = cvCreateImage(cvGetSize(img), 8, 1);IplImage* planes[] = {h_plane, s_plane};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(img,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);//获取当前直方图代表的颜色,转换成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("H-S",1);cvShowImage("H-S",hist_img);cvWaitKey(0);
}

结果:lena的直方图为:




这篇关于OpenCV入门(二十一)-- 绘制彩色图像的直方图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/869712

相关文章

Python绘制TSP、VRP问题求解结果图全过程

《Python绘制TSP、VRP问题求解结果图全过程》本文介绍用Python绘制TSP和VRP问题的静态与动态结果图,静态图展示路径,动态图通过matplotlib.animation模块实现动画效果... 目录一、静态图二、动态图总结【代码】python绘制TSP、VRP问题求解结果图(包含静态图与动态图

从入门到精通详解Python虚拟环境完全指南

《从入门到精通详解Python虚拟环境完全指南》Python虚拟环境是一个独立的Python运行环境,它允许你为不同的项目创建隔离的Python环境,下面小编就来和大家详细介绍一下吧... 目录什么是python虚拟环境一、使用venv创建和管理虚拟环境1.1 创建虚拟环境1.2 激活虚拟环境1.3 验证虚

Java List 使用举例(从入门到精通)

《JavaList使用举例(从入门到精通)》本文系统讲解JavaList,涵盖基础概念、核心特性、常用实现(如ArrayList、LinkedList)及性能对比,介绍创建、操作、遍历方法,结合实... 目录一、List 基础概念1.1 什么是 List?1.2 List 的核心特性1.3 List 家族成

c++日志库log4cplus快速入门小结

《c++日志库log4cplus快速入门小结》文章浏览阅读1.1w次,点赞9次,收藏44次。本文介绍Log4cplus,一种适用于C++的线程安全日志记录API,提供灵活的日志管理和配置控制。文章涵盖... 目录简介日志等级配置文件使用关于初始化使用示例总结参考资料简介log4j 用于Java,log4c

史上最全MybatisPlus从入门到精通

《史上最全MybatisPlus从入门到精通》MyBatis-Plus是MyBatis增强工具,简化开发并提升效率,支持自动映射表名/字段与实体类,提供条件构造器、多种查询方式(等值/范围/模糊/分页... 目录1.简介2.基础篇2.1.通用mapper接口操作2.2.通用service接口操作3.进阶篇3

Python自定义异常的全面指南(入门到实践)

《Python自定义异常的全面指南(入门到实践)》想象你正在开发一个银行系统,用户转账时余额不足,如果直接抛出ValueError,调用方很难区分是金额格式错误还是余额不足,这正是Python自定义异... 目录引言:为什么需要自定义异常一、异常基础:先搞懂python的异常体系1.1 异常是什么?1.2

Python实现Word转PDF全攻略(从入门到实战)

《Python实现Word转PDF全攻略(从入门到实战)》在数字化办公场景中,Word文档的跨平台兼容性始终是个难题,而PDF格式凭借所见即所得的特性,已成为文档分发和归档的标准格式,下面小编就来和大... 目录一、为什么需要python处理Word转PDF?二、主流转换方案对比三、五套实战方案详解方案1:

Spring WebClient从入门到精通

《SpringWebClient从入门到精通》本文详解SpringWebClient非阻塞响应式特性及优势,涵盖核心API、实战应用与性能优化,对比RestTemplate,为微服务通信提供高效解决... 目录一、WebClient 概述1.1 为什么选择 WebClient?1.2 WebClient 与

OpenCV在Java中的完整集成指南分享

《OpenCV在Java中的完整集成指南分享》本文详解了在Java中集成OpenCV的方法,涵盖jar包导入、dll配置、JNI路径设置及跨平台兼容性处理,提供了图像处理、特征检测、实时视频分析等应用... 目录1. OpenCV简介与应用领域1.1 OpenCV的诞生与发展1.2 OpenCV的应用领域2

在Java中使用OpenCV实践

《在Java中使用OpenCV实践》用户分享了在Java项目中集成OpenCV4.10.0的实践经验,涵盖库简介、Windows安装、依赖配置及灰度图测试,强调其在图像处理领域的多功能性,并计划后续探... 目录前言一 、OpenCV1.简介2.下载与安装3.目录说明二、在Java项目中使用三 、测试1.测