Python OpenCV 图像 2D 直方图,取经之旅第 27 天
Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧。
基础知识铺垫
在之前的博客中,我们获取图像直方图的方式都是获取一维直方图,简单说就是只获取一个通道的特征,例如灰度,B 通道,R 通道。
今天要学习的第一个内容是二维直方图,也叫做 2D 直方图,涉及两个特征,其中一个是像素的色调,另一个是饱和度。
有这两个值你应该能猜到,需要提前将图像转换成 HSV 格式。
cv2.calcHist 函数
计算 2D 直方图,使用的函数与之前学习的一样,也是 <kbd>cv2.calcHist</kbd> 函数。
如果获取彩色直方图,需要提前将 BGR 转换成 HSV。
函数原型
参数说明:
images: 原图像(图像格式为 uint8 或 float32),当传入函数时应该用中括号
[]
括起来,例如:[img]
;channels:
[0,1]
需要同时处理 H 和 S 两个通道;bins:
[180,256]
Hue 通道为 180,S 通道为 256;range:
[0,180,0,256]
,Hue 的取值范围在 0 到 180,饱和度 S 的取值范围在 0 到 256。
测试代码如下:
运行效果如下图所示,可以看到 2D 直方图了。
在检索资料的时候,还学习到如下展示直方图的方式,不过效果不如线条的好。
numpy 中的 2D 直方图
numpy 库也为 2D 直方图提供了一个函数,<kbd>np.histogram2d</kbd>函数。
函数原型
由于之前已经学习过 <kbd>np.histogram</kbd> 函数了,学习这个 2D 直方图函数理解上就比较容易了。
参数说明:
x, y:H 通道与 S 通道;
bins:bins 数目;
range:H 和 S 的范围。
参数更细致的说明可以通过 <kbd>help(np.histogram2d)</kbd> 查阅。
测试代码如下:
运行之后,发现结果如下图所示。
上表红线为橡皮擦标记内容,两个表进行对应。H=25,S=20 还有 H=100-150,S=120-100,可以得出黄色,蓝色,紫色区域高值,对应的原图上,结论差不多。
原图如下
官方手册可以阅读:点击跳转
橡皮擦的小节
希望今天的一个小时,你有所收获,我们下篇博客见~
相关阅读
如果你想跟博主建立亲密关系,可以关注同名公众号 <font color="red">梦想橡皮擦</font>,近距离接触一个逗趣的互联网高级网虫。博主 ID:梦想橡皮擦,希望大家<font color="red">点赞</font>、<font color="red">评论</font>、<font color="red">收藏</font>。
版权声明: 本文为 InfoQ 作者【梦想橡皮擦】的原创文章。
原文链接:【http://xie.infoq.cn/article/3c67f5486646be235b1c8d366】。文章转载请联系作者。
评论