OpenCV-Python直方图计算calcHist函数详解
☞ ░ 前往老猿Python博文目录 https://blog.csdn.net/LaoYuanPython ░
一、引言
在《《数字图像处理》第三章学习总结感悟2:直方图处理: https://blog.csdn.net/LaoYuanPython/article/details/119856466》相关的文章中介绍了直方图均衡、直方图匹配、局部直方图处理、基于直方图统计信息进行图像增强处理等图像处理与直方图相关的内容,由此可见直方图在OpenCV中大有用途,因此OpenCV中也提供了直方图计算的函数calcHist,这个函数在网上介绍的很多,不过都是基于C语言的,对OpenCV-Python版本介绍得不多,本文就该函数OpenCV-Python版本详细说明一下。
二、OpenCV图像直方图的计算
在OpenCV中,图像的直方图计算使用函数calcHist,在C语言中,该函数有多种重载形式,参数也比较多,而在Python中则不一样。
下面是C++版本的calcHist一个重载函数:
void cv::calcHist ( const Mat * images,
int nimages,
const int * channels,
InputArray mask,
OutputArray hist,
int dims,
const int * histSize,
const float ** ranges,
bool uniform = true,
bool accumulate = false
)
相关介绍网上到处都是,在此就不展开说,而OpenCV-Python关于该函数的资料却很少见,有的也基本是官方文档的简单翻译,下面就calcHist的Python版本介绍一下。
Python中因为不支持函数的多态形式,因此只有一个函数,其定义如下:
hist = cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])
这些参数说明如下:
- images:输入图像的列表,如果有多幅图像,则是列表的多个元素,但根据老猿测试,4.3的版本虽然允许输入多个图像,但处理时只处理一幅图像才能正常处理
- channels:需要处理通道的列表,需要统计的通道索引:维度通道序列,第一幅图像的通道标号从0~image[0].channels( )-1。Image[0]表示图像数组中的第一幅图像,channels()表示该图像的通道数量。同理,图像阵列中的第二幅图像,通道标号从image[0].channerls( )开始,到image[0].channerls+image[1].channels( )-1为止;第三、四幅图像的通道标号顺序依此类推;也就是说图像阵列中的所有图像的通道根据图像排列顺序,排成一个通道队列,根据老猿测试,这个多通道支持也基本不可用
- mask:图像掩膜,是和图像大小相同的8bit灰度图像矩阵,如果只计算输入图像部分区域的直方图时,可通过掩膜来设置参与计算的有效区域(掩膜有效区域的像素值非0)
- histSize:每个图像维度参与直方图计算的直方图组数
- ranges:为一个列表,表示参与直方图计算的每个维度的数值范围,即横坐标的最小值和最大值,注意最小值是参与计算的最小值,最大值本身不参与计算,即这个最小值和最大值构成的区间是个半闭半开区间,如要求灰度图的所有像素值都参与计算,则值为[0,256],如果要求计算灰度值在100-250的像素值,则应该设置为[100,251],如果是多个维度,则每个维度的计算范围最小、最大值分别追加到列表中,如有2个维度,都是0到256,则表示为:[0,256,0,256]
- hist:可选输出结果直方图阵列
- accumulate:是否累积计算标记,如果设置为True,则直方图在计算时不会将结果清除,此功能能够从多组图像中叠加计算出一个直方图,经老猿验证,OpenCV4.3-Python中好像不起作用
可以看到相比C++版本,python版本变化如下:
- 参数少了nimages,因为images就是一个列表,无需再传图像数量
- 参数少了dims,因为数字图像一般就一个物理量-灰度,因此在Python中dims默认为1,不能传值
- 参数少了uniform,这表示是否为均匀直方图,Python中强制为均匀直方图
- range参数比C++用法中少了非均匀直方图的表示法
三、直方图计算简单案例
下面构造一个简单的图像数组,来进行直方图的计算,看看计算出来的直方图数据:
import cv2
def test():img = np.array([[[1,2,3],[1,2,3],[1,2,3]],[[4,5,6],[4,5,6],[4,5,6]],[[7,8,9],[7,8,9],[7,8,9]]],dtype=np.uint8)B, G, R = cv2.split(img)hb = cv2.calcHist([B], [0], None, [9], [1,10],accumulate=True)hg = cv2.calcHist([G], [0], None, [9], [3, 8],accumulate=True)hr = cv2.calcHist([R], [0], None, [9], [1, 5], accumulate=True)print("蓝色通道的直方图矩阵如下:")print(hb.shape,hb.reshape(hb.shape[0]))print("绿色通道的直方图矩阵如下:")print(hg.shape, hg.reshape(hg.shape[0]))print("红色通道的直方图矩阵如下:")print(hr.shape, hr.reshape(hr.shape[0]))test()
上段程序首先构建了3*3的BGR格式的图像矩阵,像素值每个通道由1-9中的数字构成。使用cv2.split做了各像素的三通道拆分,拆分后三通道的像素值如下:
B通道:
G通道:
R通道:
然后分别计算三个通道的直方图数据,注意B通道指定的范围是[1,10],G是[3,8],R是[1,5],三者中绿色通道指定组数是6,其他2个通道指定的组数是9。我们来看看最终输出结果:
蓝色通道的直方图矩阵如下:
(9, 1) [3. 0. 0. 3. 0. 0. 3. 0. 0.]
绿色通道的直方图矩阵如下:
(6, 1) [0. 0. 3. 0. 0. 0.]
红色通道的直方图矩阵如下:
(9, 1) [0. 0. 0. 0. 3. 0. 0. 0. 0.]
可以看到直方图的矩阵是一个组数×1的二阶数组。
蓝色通道中1、 4、 7三个数字各自出现了三次,组设设置ranges设置为【1-10】,组数设置为9,由于上限10不参与计算,因此一个数字就是一个组,1、 4、 7三个数字分别在0组、3组和6组,因此直方图数组展开后的最终结果是[3. 0. 0. 3. 0. 0. 3. 0. 0.]。
绿色通道中2、 5、 8三个数字各自出现了三次,组设设置ranges设置为【3-8】,组数设置为6,由于上限8不参与计算,实际参与直方图计算的数字是3、4、5、6、7共5个,因此2、 5、 8三个数字实际上只有5能纳入直方图统计中,分为6组后,每组的宽度为(8-3)/6=0.833,5在第3组(组号2),因此数组展开后的最终结果是[0. 0. 3. 0. 0. 0.]。
类似地,红色通道中3、 6、 9三个数字各自出现了三次,组设设置ranges设置为【1-5】,组数设置为9,由于上限5不参与计算,实际参与直方图计算的数字是1、2、3、4共5个,因此3、 6、 9三个数字实际上只有3能纳入直方图统计中,分为9组后,每组的宽度为(5-1)/9=0.444,3在第5组(组号4),因此数组展开后的最终结果是[0. 0. 0. 0. 3. 0. 0. 0. 0.]。
**从上面的结果可以看到,参数accumulate=True没有起到作用。**不知道老猿的测试方法是否存在问题。
四、小结
本文详细介绍了OpenCV-Python图像直方图计算calcHist函数的语法以及使用案例,希望这些介绍有助于大家详细了解OpenCV-Python图像直方图计算的方法。
本文相关内容其实已经在《OpenCV-Python图像直方图计算calcHist函数详解、示例及图形呈现》中介绍,且该文中还有更多内容,但该文人气不足,老猿就简化了标题和内容,看能否有所改观。
更多图像直方图处理的内容请参考《《数字图像处理》第三章学习总结感悟2:直方图处理》的介绍。
更多图像处理请参考专栏《OpenCV-Python图形图像处理》及《图像处理基础知识》的介绍。
对于缺乏Python基础的同仁,可以通过老猿的免费专栏《 专栏:Python基础教程目录》从零开始学习Python。
如对文章内容存在疑问,可在博客评论区留言,或关注:老猿Python 微信公号发消息咨询,可通过扫博客左边的二维码加微信公众号。
写博不易,敬请支持:
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!
关于老猿的付费专栏
- 付费专栏《https://blog.csdn.net/laoyuanpython/category_9607725.html 使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,对应文章目录为《 https://blog.csdn.net/LaoYuanPython/article/details/107580932 使用PyQt开发图形界面Python应用专栏目录》;
- 付费专栏《https://blog.csdn.net/laoyuanpython/category_10232926.html moviepy音视频开发专栏 )详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/107574583 moviepy音视频开发专栏文章目录》;
- 付费专栏《https://blog.csdn.net/laoyuanpython/category_10581071.html OpenCV-Python初学者疑难问题集》为《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的伴生专栏,是笔者对OpenCV-Python图形图像处理学习中遇到的一些问题个人感悟的整合,相关资料基本上都是老猿反复研究的成果,有助于OpenCV-Python初学者比较深入地理解OpenCV,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/109713407 OpenCV-Python初学者疑难问题集专栏目录 》
- 付费专栏《https://blog.csdn.net/laoyuanpython/category_10762553.html Python爬虫入门 》站在一个互联网前端开发小白的角度介绍爬虫开发应知应会内容,包括爬虫入门的基础知识,以及爬取CSDN文章信息、博主信息、给文章点赞、评论等实战内容。
前两个专栏都适合有一定Python基础但无相关知识的小白读者学习,第三个专栏请大家结合《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的学习使用。
对于缺乏Python基础的同仁,可以通过老猿的免费专栏《https://blog.csdn.net/laoyuanpython/category_9831699.html 专栏:Python基础教程目录)从零开始学习Python。
如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。
老猿Python,跟老猿学Python!
☞ ░ 前往老猿Python博文目录 https://blog.csdn.net/LaoYuanPython ░
OpenCV-Python直方图计算calcHist函数详解相关推荐
- OpenCV-Python图像直方图计算calcHist函数详解、示例及图形呈现
☞ ░ 前往老猿Python博文目录 https://blog.csdn.net/LaoYuanPython ░ 一.引言 在前面几篇直方图相关的文章中介绍了直方图均衡.直方图匹配.局部直方图处理.基 ...
- 【opencv学习笔记】025之直方图计算 - calcHist函数详解
前言 如果你想了解更多有关于计算机视觉.OpenCV.机器学习.深度学习等相关技术的内容,想与更多大佬一起沟通,那就扫描下方二维码加入我们吧! 1.calcHist函数是干什么滴? 这个问题嘛,看看标 ...
- Python seek()和tell()函数详解
Python seek()和tell()函数详解 在讲解 seek() 函数和 tell() 函数之前,首先来了解一下什么是文件指针. 我们知道,使用 open() 函数打开文件并读取文件中的内容时, ...
- Python中的bbox_overlaps()函数详解
Python中的bbox_overlaps()函数详解 想要编写自己的目标检测算法,就需要掌握bounding box(边界框)之间的关系.在这之中,bbox_overlaps()函数是一个非常实用的 ...
- 【Python基础】reduce函数详解
转载请注明出处:[Python基础]reduce函数详解 reduce函数原本在python2中也是个内置函数,不过在python3中被移到functools模块中. reduce函数先从列表(或序列 ...
- OpenCV之直方图绘制(calcHist函数详解)
目录 1.直方图的定义 2.calcHist()函数说明 3.绘制直方图 3.1 读取原图像并检查图像是否读取成功 3.2 定义直方图参数并计算直方图 3.3 绘制直方图 4.关于BGR直方图的绘制 ...
- OpenCV 图像直方图计算calcHist()
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/keith_bb/article/details/56680997 图像直方图是对数据集合的一种统计方 ...
- 【OpenCV4】图像直方图生成函数calcHist()使用详解
calcHist() 函数有 3 个构造函数 第一个构造函数: calcHist() [1/3] void cv::calcHist ( const Mat * images, int nimages ...
- OpenCV中直方图反向投影算法详解与实现
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达本文转自:opencv学堂 一:直方图交叉 OpenCV中直方图反向 ...
最新文章
- Python 的一万种用法:制作 Web 可视化页面
- linux与windows下开发,Linux 与 Windows下开发感受
- c#_textbox显示刷新规定行数的数据
- 码农和程序员等的差别
- mysql 5.7版本目录无data文件夹的解决办法
- 2019mysql安装_2019mysql安装过程
- VueJS样式绑定:v-bind
- jQuery 事件函数传参异常identifier starts immediately after numeric literal
- zblog php伪静态,zblogphp如何设置伪静态
- PBRNet:Progressive Boundary Refinement Network for Temporal Action Detection (AAAI 2020)
- 重置系统_WIN10系统如何创建密码重置盘
- Hbase权威指南(含目录,高清,免费)
- 当Java遇上机密计算
- ACDSee10 正版授权 许可证
- 内网渗透(一)——本机信息收集
- html5 js打开新页面,当前页面打开多个新页面的js (很流畅)
- 最新圣思园经典Java培训教学全套
- CAD 开发 渐变填充
- vue中防止用户频繁点击按钮
- 史上绝地反击,美式英语英文学习大全。美国英语最新词频表
热门文章
- 打包Chrome的插件扩展程序
- 了解无线充电基础知识
- 索尼便携无线随身存储服务器,新玩意儿!!索尼的黑科技 便携式个人空调设备,只为怕热的你们...
- 09.11.11王子和公主从此过上了幸福的生活
- android webview 5.0httt,Android5.0开始,WebView默认情况下,不支持同时加载Https和Http混合模式...
- JAVA第一阶段 编程练习(2)
- Java——聊聊JUC中的CompletableFuture
- 防水蓝牙耳机什么牌子好、防水效果好的运动耳机推荐
- 关于路由器多个WAN口时的路由表维护
- 百度地图API之如何制作驾车导航