python - 使用 openCV for python 进行反投影

标签 python opencv histogram

我正在使用用于 Python 的 openCV,即 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 数组。

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

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

最佳答案

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

关于python - 使用 openCV for python 进行反投影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15162039/

相关文章:

python - MATLAB 的直方图均衡有什么问题?

python - 在书写行之间留出空间

python - 如何在 python 中对段落进行编码以在 CSV 文件中使用

python - 我在 python 中遇到列表退出错误

c++ - OpenCV 加载/保存直方图数据

gnuplot - 在 gnuplot 中标准化直方图箱

python - 如何在所有 Dictionary.Values() 中搜索字符串中的所有字符

ios - OpenCV 以像素为单位获取坐标/半径

visual-c++ - 使用 opencv 进行双阈值处理

c - 学习openCV : Use the pointer element to access cvptr2D to point to the middle 'green' channel. 在20,5和40,20之间绘制矩形