2

我正在为 Python 使用 openCV,即 cv2 库。我使用以下函数来计算图像 im_converted 的直方图

hist = cv2.calcHist([im_converted], channels, None, histSize, ranges,hist, 1)

其中 im_converted 作为 uint8 类型的 numpy 数组加载。

hist 似乎被迫成为 float32 类型的 numpy 数组。当我使用反投影功能时会出现问题。(注意:我标准化直方图 st np.sum(hist)=1)

backProj = cv2.calcBackProject([im_converted], channels, hist, ranges,scale);

文档在这里。backProj 被迫成为一个 uint8 numpy 数组。

  • 如果 scale=1,则 backProj = 0
  • 如果 scale=255 则 backProj 不为零,但值非常小。

我的问题是:考虑到类型之间的差异,应该应用什么比例因子?没有办法改变类型吗?(注意:我试图做 hist=zeros(histSize, dtype=uint8) 但这不成功,我最后还是得到了一个 float32 直方图。)

4

1 回答 1

3

这取决于您的图像大小。如果您的图像有超过 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 对应于最常见的颜色。

于 2013-03-01T18:16:51.270 回答