C++ opencv图像直方图

news2024/11/18 13:45:49

1.图像直方图概念


图像有很多基础概念,在我们学习的过程中因为一些原因无法涉及,但这并不代表它们不重要

今天,我们就来介绍一个概念——图像直方图

图像直方图,是图像处理中很重要的一个基础概念,
有很多的算法,比如传统的特征工程,跟它都有千丝万缕的关系

图像直方图是图像像素值的统计学特征。
由于其计算代价较小,且具有图像平移、旋转、缩放不变性等众多优点,广泛地应用于图像处理的各个领域,特别是灰度图像的阈值分割、基于颜色的图像检索以及图像分类、反响投影跟踪。

图像直方图常见的分为:

灰度直方图
颜色直方图

示例如下
在这里插入图片描述

在这里插入图片描述

图像直方图(Image Histogram)是用以表示数字图像中亮度分布的直方图,标绘了图像中每个亮度值的像素数。这种直方图中

横坐标的左侧为纯黑、较暗的区域,
右侧为较亮、纯白的区域。
因此一张较暗图片的直方图中的数据多集中于左侧和中间部分,而整体明亮、只有少量阴影的图像则相反。
CV 领域常借助图像直方图来实现图像的二值化。

图像直方图中,也有直方图的两个概念

bin——bin是的X轴上每一组的长度,比如组长为1,就是bin中包含1个像素值。
bin由bins和取值范围决定
bins——binsX轴上的组数,对于像素值取值在0~255之间,如果bins = 256,则bin = 1
此外对于该取值范围来说,bins还可以有16、32、48、128等。
但一定要满足,256除以bin的大小应该是整数


简单来说,图像直方图就是对图像像素数据进行统计的一种方法
一幅灰度图像:图像直方图将0-255不同值分布在坐标系的X轴上,对应像素值的数量分布在Y轴上。
当bins=256时,此时(100,50),就表示值是100的像素有50个。
 

说明:

图像直方图可以唯一标识一张图像吗?

通常直方图的维数要低于原始数据,所以它的信息有缺,图像直方图并不能唯一表示一张图像。

那什么可以作为图像的"DNA",唯一标识一张图像呢?

特征工程就可以,这种真正的特征描述值会把图像变成一堆向量。
有很多种的法可以做特征工程,比如传统图像处理的特征提取

2.绘制彩色图像的一维直方图

API应用

calcHist

calcHist
    计算一维数组的直方图(输入图像可以有多通道)
        共10个参数
            第1个参数 图像数组
            第2个参数 输入图像数量
            第3个参数 通道数组
            第4个参数 可选mask
            
            第5个参数 输出直方图数据(值与对应频次)的n维数组
            第6个参数 直方图维数

                    当通道为1个时,我们选择维度为1维,此时直方图数据就为一维数组
                    当维度为2个时,我们选择维度为2维,此时直方图数据就为二维数组
                    ………………
                    也就是说,n张图像 每张图像m个通道 也可以计算出相应的直方图数据
                    
                    但对于绘制来说,一般都只绘制到2维,3维及以上就很复杂了

            第7个参数 histSize( bins数组,x轴长度)
            第8个参数 ranges(取值范围数组)
            
            //以下参数暂时用不到
            第9个参数 指示直方图bin间隔是否一致
                        默认为true,即等间隔取值
                        如果为false,则range不能写{0,255}这种,就要写{1,1,……,1}这种
                                
            第10个参数 累计标志(默认为false)
                        当多张图像的时候,
                            如果为true,则绘制直每张方图的时候,不会从头清空
                            会在前者直方图的基础上继续

cvRound

cvRound
	将浮点数四舍五入到最近的整数
		共1个参数
			第1个参数 要处理的浮点数

本课中计算的直方图维数为1维,采取方式为:

先把bgr三通道分离
然后进行每个通道的直方图数据计算,得到一维数组
再然后对直方图一维数组进行归一化处理
最后利用直方图一维数组绘制直方图

为什么这里要归一化呢?

因为一张图中,有些值的频次会过大,不方便绘制直方图

为什么还要要利用得到的数据数组绘制,而不是直接显示它?

因为计算的到直方图数据数组,是一个大小为256的一维数组,它的每个值对应一个频次
当我们用cout输出直方图数据,会得到256 * 1的列矩阵
直接显示这个数组的话就是如下。
 

实例代码:

//函数定义
void showHistogram_demo(Mat& image);

//函数实现
void QuickDemo::showHistogram_demo(Mat& image) {

	//三通道分离
	std::vector<Mat> bgr;
	split(image, bgr);

	//定义参数变量
	const int channels[1] = { 0 };
	Mat b_hist, g_hist, r_hist;
	const int bins[1] = { 256 };

	float xrange[2] = { 0,255 };
	const float* ranges[1] = { xrange };

	//计算Blue,Green,Red三通道各自的直方图
	calcHist(&bgr[0], 1, channels, Mat(), b_hist, 1, bins, ranges);
	calcHist(&bgr[1], 1, channels, Mat(), g_hist, 1, bins, ranges);
	calcHist(&bgr[2], 1, channels, Mat(), r_hist, 1, bins, ranges);

	//imshow("00", b_hist);
	//std::cout << b_hist;

	//显示直方图
	int hist_w = 512;
	int hist_h = 400;
	int bin_w = cvRound((double)hist_w / bins[0]);
	Mat histImage = Mat::zeros(Size(hist_w, hist_h), CV_8UC3);

	//归一化直方图数据为指定范围
	normalize(b_hist, b_hist, 0, hist_h, NORM_MINMAX, -1, Mat());
	normalize(g_hist, g_hist, 0, hist_h, NORM_MINMAX, -1, Mat());
	normalize(r_hist, r_hist, 0, hist_h, NORM_MINMAX, -1, Mat());

	//绘制直方图曲线
	for (int i = 0; i < 256; i++) {

		Point p01(bin_w * i, hist_h - cvRound(b_hist.at<float>(i)));
		/*
		第一个点横向坐标:bin_w*i: 即 512/256 再 * i
		第二个点纵向坐标:直方图纵高 - 根据直方图纵高归一化后的频次,即为纵向坐标

						当频次很低时,减的少,就靠下,反之靠上
		*/
		//线段的下一个点
		Point p02(bin_w * i + 1, hist_h - cvRound(b_hist.at<float>(i + 1)));

		Point p11(bin_w * i, hist_h - cvRound(g_hist.at<float>(i)));
		Point p12(bin_w * i + 1, hist_h - cvRound(g_hist.at<float>(i + 1)));

		Point p21(bin_w * i, hist_h - cvRound(r_hist.at<float>(i)));
		Point p22(bin_w * i + 1, hist_h - cvRound(r_hist.at<float>(i + 1)));


		line(histImage, p01, p02, Scalar(255, 0, 0), 1, 8, 0);
		line(histImage, p11, p12, Scalar(0, 255, 0), 1, 8, 0);
		line(histImage, p21, p22, Scalar(0, 0, 255), 1, 8, 0);

	}

	imshow("直方图", histImage);

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/11451.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用HTML+CSS做一个漂亮简单的旅游网站——旅游网页设计与实现(6页)HTML+CSS+JavaScript

&#x1f468;‍&#x1f393;学生HTML静态网页基础水平制作&#x1f469;‍&#x1f393;&#xff0c;页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码&#xff0c;这是一个不错的旅游网页制作&#xff0c;画面精明&#xff0c;排版整洁&#xff0c;内容…

(八)Java算法:堆排序(详细图解)

目录一、前言1.1、概念1.2、大根堆特点二、maven依赖三、流程解析3.1、初始建堆3.2、堆化第一步3.2、堆化第二步3.3、堆化第三步3.4、堆化第四步3.5、堆化第五步3.6、堆化第六步四、编码实现4.1、代码实现4.2、运行结果&#xff1a;扩展一、前言 1.1、概念 根据堆的结构可以分…

彩印图文版《Elasticsearch实战》文档,阿里内部共享,堪称精品

学习是一种基础性的能力。然而&#xff0c;“吾生也有涯&#xff0c;而知也无涯。”&#xff0c;如果学习不注意方法&#xff0c;则会“以有涯随无涯&#xff0c;殆矣”。 学习就像吃饭睡觉一样&#xff0c;是人的一种本能&#xff0c;人人都有学习的能力。我们在刚出生的时候…

Lesson1强化学习(RL)初印象 学习笔记

一、强化学习引入 ​ 人的智能可以遗传获得也可以通过后天学习&#xff1b;学习有两种&#xff0c;模仿前人的经验是一种学习&#xff1b;如果没有前人的经验可以学习&#xff0c;就需要和环境进行交互&#xff0c;得到反馈来学习。 #mermaid-svg-XUxguPj6VHcJMK3W {font-famil…

the account is locked

感谢阅读问题描述解决方案1.WinR打开命令行输入&#xff1a;sqlplus &#xff0c;或者使用sqlplus / as sysdba;无需输入密码。2.假设我们要解锁的账户是scott3.修改密码&#xff0c;从而避免再次被锁4.重启服务或者客户端&#xff08;看你是桌面版还是服务器版&#xff09;&am…

警惕,3D建模为什么选3dsMAX不选MAYA

如今现在的游戏建模都是次世代建模&#xff0c;3DMAX确实是主流软件之一&#xff0c;但是为什么说MAYA更好呢❓ 首先&#xff0c;两款软件都很适合用现代的建模&#xff0c;但是难度上有一定的差异❌ • 软件区别 &#x1f340;3DSMAX&#xff1a; 它是目前使用最广泛的3d软…

十、Mysql的DQL语句

Mysql的DQL语句十、Mysql的DQL语句select的查询一、查看系统参数二、select常用函数三、select的单表查询1、from子句2、where子句2.1 where配合等值查询2.2where配合比较操作符(> < > < <>)2.3where配合逻辑运算符(and or )2.4where配合模糊查询2.5where配合…

流量控制可靠传输机制停止-等待协议

注&#xff1a;最后有面试挑战&#xff0c;看看自己掌握了吗 文章目录链路层流量控制和传输层的流量控制区别停止-等待协议为什么要有停止等待协议无差错情况滑动窗口协议后退N帧协议GBN选择重传协议SR可靠传输流量控制&#x1f343;博主昵称&#xff1a;一拳必胜客 &#x1f3…

供应链全流程计划与排产解决方案核心功能概要

通过数字智能化运营实现将本增效至为重要。 许多企业的业务现状是销售、生产计划与市场不匹配&#xff0c;企业的运营效率低且成本高&#xff1a; 销售计划计划需要大量的人员进行沟通&#xff0c;销售预测的分析维度少、粒度粗&#xff0c;不仅效率低&#xff0c;且预测只是一…

【mycat】常用分片规则

一、 常用分片规则 1、取模 ​ 此规则为对分片字段求摸运算。也是水平分表最常用规则 2、分片枚举 ​ 通过在配置文件中配置可能的枚举 id&#xff0c;自己配置分片&#xff0c;本规则适用于特定的场景&#xff0c;比如有些业务需要按照省份或区县来做保存&#xff0c;而全…

Delphi Enterprise具有强大视觉设计功能

Delphi Enterprise具有强大视觉设计功能 Delphi可帮助您使用Object Pascal为Windows、Mac、Mobile、IoT和Linux构建和更新数据丰富、超连接、可视化的应用程序。Delphi Enterprise适用于构建客户端/服务器或多层应用程序、REST服务等的开发团队。 Delphi功能 单一代码库-用更少…

小程序在线客服完整实现

1、先注册公众号》小程序(需实名认证) 2、开发》测试》上传》审核发布》发布》使用 3、公众号(订阅号或服务号)与小程序(此为在线客服)通过同一主体绑定可以打通调用 建议 内测完成后再上传。如果多次上传demo会处罚的。 添加客服人员列表(授权)可以电脑、手机端均…

(免费分享)springboot论坛bbs系统

源码获取&#xff1a;关注文末gongzhonghao&#xff0c;输入010领取下载链接 开发工具&#xff1a;IDEA 数据库mysql5.7 技术&#xff1a;springbootjpashiroredislayui 前台截图&#xff1a; 后台截图&#xff1a; package com.qxczh.admin.service.impl;impor…

云南美食介绍 简单静态HTML网页作品 美食餐饮网站设计与实现 学生美食网站模板

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

A puma at large

New words and expressions puma n. 美洲狮 spot v. 看出,发现 evidence n. 证据 accumulate v. 积累,积聚 oblige v. 使……感到必须 hunt n. 追猎;寻找 blackberry n. 黑莓 Pumas are large, cat-like animals which are found in America. When reports came i…

点击化学PEG试剂巯基吡啶-PEG-叠氮,OPSS-PEG-azide,OPSS-PEG-N3

点击化学PEG试剂OPSS-PEG-azide&#xff08;OPSS-PEG-N3 &#xff09;化学试剂其中文名为巯基吡啶-聚乙二醇-叠氮&#xff0c;它所属分类为Azide PEG Orthopyridyl disulfide (OPSS) PEG。 其分子量均可定制&#xff0c;有&#xff1a;2K 巯基吡啶-PEG-叠氮、5k OPSS-PEG-N3、…

TCP/IP协议、UDP协议及网络基础概念

网络程序设计编写的是与其他计算机进行通信的程序。Java已经将网络程序所需要的东西封装成不同的类&#xff0c;用户只要创建这些类的对象&#xff0c;使用相应的方法&#xff0c;即使不具备有关的网络知识&#xff0c;也可以编写出高质量的网络通信程序。 1.局域网与因特网 …

如何快速实现根因分析/业务大盘

Ideas Worth Spreading 写在前面的话 特别感谢 感谢在最早开发鱼骨图带领我前进的技术负责人-佳哥&#xff08;总监&#xff09;。他一丝不苟的技术态度、严密的逻辑和高要求&#xff08;这里大家都懂的&#xff09;&#xff0c;让我成长。这里是他在语雀的博客&#xff0c;其…

(new online judge)1322蓝桥杯2017初赛 包子凑数

P1322 - [蓝桥杯2017初赛]包子凑数 - New Online Judge 题目分两步&#xff1a;&#xff08;1&#xff09;判断结果是否为INF&#xff1b;&#xff08;2&#xff09;如果不是INF&#xff0c;统计数量。考点是“数论gcd简单DP”。 1. 什么时候答案不是INF 什么时候答案不是INF…

ADSP21489之CCES开发笔记(六)

一、仿真调试CCES代码 1、导入21489的Demo代码 2、修改设计SS4SH存储代码&#xff0c;如红框部分 3、搭配USBi调试&#xff0c;修改如下代码部分 oSSnConfig.bSkipInitialDownload 0; //usbi调试时&#xff0c;设置为0&#xff0c;默认为1 oCommConfig.nSelectSPI SELECT_SP…