首页 > 解决方案 > OpenCV Python CalcHist:如何在 RGB 值范围内堆叠像素数?

问题描述

由于每个 RGB 通道的 OpenCV calcHist 函数,我正在尝试获取图片的 RGB 直方图。目前,我已经成功获得了一个直方图,显示我的图像中有多少像素对于从 0 到 256 的每个色调值(在三个颜色通道中的每一个上)。但我想获得的是在许多颜色值范围内的像素。例如 :

在红色通道中,我的图像上有多少像素从 0 到 50,然后从 51 到 100,依此类推?直到 256,以及绿色和蓝色通道。

我已经阅读了一些关于 OpenCV 和 calcHist 函数的文档和主题,但我不明白范围和 Bins 在 Python 中是如何工作的。

我特别读过这个:https ://docs.opencv.org/2.4/modules/imgproc/doc/histograms.html?highlight=calchist#calchist

还有这个:OpenCV - 使用 calcHist 的混淆

(在这个以前的来源上,它们从 RGB 传递到 HSV,我不需要)

这是我用来获取 RGB 通道上每个色调值从 0 到 256 的像素数的代码。

import cv2
import matplotlib.pyplot as plt

name = "imagePath"
img = cv2.imread(name)

color = ('b','g','r')

for i, col in enumerate(color):
    histr = cv2.calcHist([img],[i],None,[256],[0,256])
    plt.plot(histr,color = col)
    plt.xlim([0,256])

plt.show()

我得到这个直方图。这对我来说似乎是正确的:

https://zupimages.net/up/19/34/c3qf.png

当我尝试这段代码时:

import cv2
import matplotlib.pyplot as plt

name = "imagePath"
img = cv2.imread(name)

color = ('b','g','r')

for i, col in enumerate(color):
    histr = cv2.calcHist([img],[i],None,[256],[0,9])
    plt.plot(histr,color = col)
    plt.xlim([0,256])

plt.show()

我得到这个直方图:

https://zupimages.net/up/19/34/2tty.png

这似乎不正确。与第一个直方图相比,我应该在 150 到 200 之间的红色曲线上和 200 到 255 之间的绿色曲线上有像素峰。

我究竟做错了什么 ?我对 calcHist 函数中的范围和 bin 有什么不了解的地方?

谢谢,

标签: pythonopencvrangehistogram

解决方案


您询问 [0 9] 上的范围,因此输出值在该范围内。从第一个直方图来看,这里似乎只有蓝色。您在 [0 256] 上绘制了 9 个值,但仍然有 9 个值。

要拥有 10 个范围,每个范围有 25 个值,您可以尝试:

for i, col in enumerate(color):
    histr = cv2.calcHist([img],[i],None,[10],[0,256])
    plt.plot(histr,color = col)
    plt.xlim([0,10])

plt.show()

推荐阅读