2013-03-01 67 views
2

我使用openCV for Python,cv2库。我用下面的函数来计算的图像的直方图im_converted使用openCV for python的背投影

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

其中im_converted加载为类型UINT8的numpy的阵列。

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

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

该文档是here。 backProj被迫成为一个uint8 numpy数组。

  • 如果比例= 1,则backProj = 0
  • 如果标度= 255,那么backProj是非零的,但这些值是非常小的。

我的问题是:鉴于类型之间的差异,应该应用的比例因子是多少?没有改变类型的方法吗? (注意:我试图做hist =零(histSize,dtype = uint8),但这是不成功的,我仍然得到了一个float32直方图。)

回答

3

这取决于您的图像大小。如果您的图像超过255个像素,那么直方图的uint8数据类型是不够的,因为分箱可能会过度流动。

看来OpenCV的线军队从calcBackProject返回的图像的数据类型是相同的图像中通过。如果你在一个uint8图像通过,但你float32直方图具有超过255个的反投影的图像可能会被裁剪较大的值。

这样做的最明智的办法似乎是保持比例= 1.0,但通过在一个float32图像0​​:

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

另一种方法是在uint8图像通过,但设置比例为255./hist.max()。因此,背投影图像中的255将对应最常用的颜色。