使用OpenCV进行Python的反向投影

2 投票
1 回答
3014 浏览
提问于 2025-04-17 17:36

我正在使用Python的openCV库,也就是cv2库。我用下面的函数来计算一个叫im_converted的图像的直方图。

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

其中,im_converted是以uint8类型的numpy数组加载的。

hist似乎被强制要求为float32类型的numpy数组。当我使用反向投影函数时就出现了问题。(注意:我把直方图进行了归一化,使得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类型的直方图。)

1 个回答

3

这要看你的图片大小。如果你的图片像素超过255个,那么用uint8这种数据类型来做直方图就不够用了,因为可能会出现溢出的问题。

看起来OpenCV在调用calcBackProject时,会强制返回的图像数据类型和你传入的图像数据类型保持一致。如果你传入的是uint8类型的图像,但你的float32类型的直方图中有值超过255,那么你得到的反向投影图像可能会被截断。

最合理的做法是保持比例(scale)为1.0,但传入一个float32类型的图像给calcBackProject

backProj = cv2.calcBackProject([im_converted.astype('float32')], channels, hist, ranges, scale)

另一种选择是传入uint8类型的图像,但将比例设置为255. / hist.max()。这样,在你的反向投影图像中,255就对应于出现频率最高的颜色。

撰写回答