【发布时间】:2019-12-27 14:49:30
【问题描述】:
感谢每个 RGB 通道的 OpenCV calcHist 函数,我正在尝试获取图片的 RGB 直方图。目前,我已经成功获得了一个直方图,显示了从 0 到 256 的每个色调值(在三个颜色通道中的每一个上)有多少像素在我的图像中。但我想获得的是在许多颜色值范围内的像素。例如:
我的图像上有多少像素从红色通道的 0 到 50,然后从 51 到 100,等等?直到 256,在绿色和蓝色通道中也是如此。
我已经阅读了一些关于 OpenCV 和 calcHist 函数的文档和主题,但我不明白 Python 中的范围和 Bins 是如何工作的。
我特别读过这个:https://docs.opencv.org/2.4/modules/imgproc/doc/histograms.html?highlight=calchist#calchist
还有这个:OpenCV - Confusion using 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 有什么不了解的地方?
谢谢,
【问题讨论】:
-
您要求 [0 9] 上的范围,因此输出值在该范围内。从第一个直方图来看,这里似乎只有蓝色。注意:您 绘制 [0 256] 上的 9 个值,但您仍然有 9 个值。您对 [0 9] 范围有何期望?
-
我希望有 10 个间隔,每个间隔有 25 个值。 [0,24],[25,49]...[225,249]。我真的不知道该怎么做。对不起,如果这是一个愚蠢的问题。
标签: python opencv range histogram