python - 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
(在这个以前的来源上,它们从 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 个值。
要拥有 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()