添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
胆小的豆浆  ·  c语言转java-掘金·  2 年前    · 
刀枪不入的柿子  ·  Gitlab-Ci : ...·  3 年前    · 
奔放的排球  ·  wpf - XAML trigger ...·  3 年前    · 

基础知识铺垫

在之前的博客中,我们获取图像直方图的方式都是获取一维直方图,简单说就是只获取一个通道的特征,例如灰度,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,可以得出黄色,蓝色,紫色区域高值,对应的原图上,结论差不多。

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

    橡皮擦的小节

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

    如果你有想要交流的想法、技术,欢迎在评论区留言。

    博主 ID:梦想橡皮擦,希望大家点赞、评论、收藏。

    分类:
    后端
    标签: