我正在使用用于 Python 的 openCV,即 cv2 库。我使用以下函数来计算图像 im_converted 的直方图
hist = cv2.calcHist([im_converted], channels, None, histSize, ranges,hist, 1)
其中 im_converted 作为 uint8 类型的 numpy 数组加载。
hist 似乎被迫成为 float32 类型的 numpy 数组。当我使用反投影函数时出现问题。 (注意:我对直方图进行了归一化 s.t np.sum(hist)=1)
backProj = cv2.calcBackProject([im_converted], channels, hist, ranges,scale);
文档是here 。 backProj 被强制为 uint8 numpy 数组。
- 如果scale=1,则backProj = 0
- 如果scale=255,则backProj不为零,但值非常小。
我的问题是:考虑到类型之间的差异,应该应用什么比例因子?没有办法改变类型吗? (注意:我尝试执行 hist=zeros(histSize, dtype=uint8) 但这不成功,最终我仍然得到了一个 float32 直方图。)
最佳答案
这取决于您的图像尺寸。如果您的图像超过 255 个像素,则直方图的 uint8 数据类型是不够的,因为 bin 可能会溢出。
OpenCV 似乎强制使用 calcBackProject
返回图像的数据类型与传入的图像相同。如果您传入 uint8
图像但你的float32
直方图的值大于 255,您的反投影图像可能会被剪裁。
最明智的做法似乎是保持比例 = 1.0 但传入 float32
图片发送至calcBackProject
:
backProj = cv2.calcBackProject([im_converted.astype('float32')], channels, hist, ranges,scale)
另一种选择是传入 uint8
图像,但将比例设置为 255. / hist.max()
。因此,反投影图像中的 255 将对应于最常见的颜色。
关于python - 使用 openCV for python 进行反投影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15162039/