使用OpenCV进行Python的反向投影
我正在使用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就对应于出现频率最高的颜色。