我正在使用openCV for Python,即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数组。
我的问题是:鉴于类型之间的差异,应该应用的比例因子是多少?是不是有办法改变类型? (注意:我试过做hist = zeros(histSize,dtype = uint8),但这不成功,我最后还是得到了一个float32直方图。)
答案 0 :(得分:3)
这取决于您的图像尺寸。如果您的图像有超过255个像素,那么直方图的uint8数据类型是不够的,因为这些垃圾箱可能会溢出。
似乎行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对应于最常用的颜色。