Python OpenCV 图像2D直方图,取经之旅第 27 天

Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧。

基础知识铺垫

在之前的博客中,我们获取图像直方图的方式都是获取一维直方图,简单说就是只获取一个通道的特征,例如灰度,B 通道,R 通道。

今天要学习的第一个内容是二维直方图,也叫做 2D 直方图,涉及两个特征,其中一个是像素的色调,另一个是饱和度。

有这两个值你应该能猜到,需要提前将图像转换成 HSV 格式。

cv2.calcHist 函数

计算 2D 直方图,使用的函数与之前学习的一样,也是 cv2.calcHist 函数。

如果获取彩色直方图,需要提前将 BGR 转换成 HSV。

函数原型

cv2.calcHist(images, channels, mask, histSize,ranges[, hist[,accumulate]])

参数说明:

  • 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。

测试代码如下:

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

def create_2d_hist(image):
    hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV)
    hist = cv.calcHist([hsv], [0, 1], None, [180, 256],  [0, 180, 0, 256])
    return hist

img = cv.imread('2.jpg')
hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)
plt.plot(create_2d_hist(img))

plt.show()

运行效果如下图所示,可以看到 2D 直方图了。

在检索资料的时候,还学习到如下展示直方图的方式,不过效果不如线条的好。

plt.imshow(hist,interpolation = 'nearest')

numpy 中的 2D 直方图

numpy 库也为 2D 直方图提供了一个函数,np.histogram2d函数。

函数原型

由于之前已经学习过 np.histogram 函数了,学习这个 2D 直方图函数理解上就比较容易了。

histogram2d(x, y, bins=10, range=None, normed=None, weights=None, density=None)

参数说明:

  • x, y:H 通道与 S 通道;
  • bins:bins 数目;
  • range:H 和 S 的范围。

参数更细致的说明可以通过 help(np.histogram2d) 查阅。

测试代码如下:

运行之后,发现结果如下图所示。

上表红线为橡皮擦标记内容,两个表进行对应。H=25,S=20 还有 H=100-150,S=120-100,可以得出黄色,蓝色,紫色区域高值,对应的原图上,结论差不多。

原图如下

官方手册可以阅读:点击跳转

橡皮擦的小节

希望今天的一个小时,你有所收获,我们下篇博客见~

今天是持续写作的第 67 / 100 天。
如果你有想要交流的想法、技术,欢迎在评论区留言。


如果你想跟博主建立亲密关系,可以关注同名公众号 梦想橡皮擦,近距离接触一个逗趣的互联网高级网虫。
博主 ID:梦想橡皮擦,希望大家点赞评论收藏

免责声明:务必仔细阅读

  • 本站为个人博客,博客所转载的一切破解、path、补丁、注册机和注册信息及软件等资源文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。

  • 本站为非盈利性站点,打赏作为用户喜欢本站捐赠打赏功能,本站不贩卖软件等资源,所有内容不作为商业行为。

  • 本博客的文章中涉及的任何解锁和解密分析脚本,仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断.

  • 本博客的任何内容,未经许可禁止任何公众号、自媒体进行任何形式的转载、发布。

  • 博客对任何脚本资源教程问题概不负责,包括但不限于由任何脚本资源教程错误导致的任何损失或损害.

  • 间接使用相关资源或者参照文章的任何用户,包括但不限于建立VPS或在某些行为违反国家/地区法律或相关法规的情况下进行传播, 博客对于由此引起的任何隐私泄漏或其他后果概不负责.

  • 请勿将博客的任何内容用于商业或非法目的,否则后果自负.

  • 如果任何单位或个人认为该博客的任何内容可能涉嫌侵犯其权利,则应及时通知并提供身份证明,所有权证明至admin@proyy.com.我们将在收到认证文件后删除相关内容.

  • 任何以任何方式查看此博客的任何内容的人或直接或间接使用该博客的任何内容的使用者都应仔细阅读此声明。博客保留随时更改或补充此免责声明的权利。一旦使用并复制了博客的任何内容,则视为您已接受此免责声明.

您必须在下载后的24小时内从计算机或手机中完全删除以上内容.

您使用或者复制了本博客的任何内容,则视为已接受此声明,请仔细阅读


更多福利请关注一一网络微信公众号或者小程序

一一网络微信公众号
打个小广告,宝塔服务器面板,我用的也是,很方便,重点是免费的也能用,没钱太难了,穷鬼一个,一键全能部署及管理,送你3188元礼包,点我领取https://www.bt.cn/?invite_code=MV9kY3ZwbXo=


一一网络 » Python OpenCV 图像2D直方图,取经之旅第 27 天

发表评论

发表评论

一一网络-提供最优质的文章集合

立即查看 了解详情