将opencv阈值应用于numpy数组

时间:2010-10-11 03:59:52

标签: python opencv numpy

我正在尝试将opencv的Threshold函数应用于numpy数组。我正在使用opencv 2.1的python绑定。它是这样的:

import cv
import numpy as np
a = np.random.rand(1024,768)
cv.Threshold(a,a,0.5,1,cv.CV_THRESH_BINARY)

这会引发错误:

OpenCV Error: Unsupported format or combination of formats () in threshold

所以,我不相信我知道自己在做什么,但我希望Threshold可以像Smooth一样工作,我可以在其中运行

cv.Smooth(a,a)

没有任何问题,最终得到一个平滑的(呃)图像。我不确定如何考虑像opencv看到的numpy数组的“格式”,但我不愿意将numpy数组转换为opencv图像格式,如果我不需要(并且我的所有尝试都失败了无论如何)。

我想知道为什么Threshold没有以明显天真的方式工作,我试图让它发挥作用,而且知道我应该做些什么会很棒。

P.S。我知道我自己可以在numpy数组上执行阈值操作,但我想弄清楚opencv。

1 个答案:

答案 0 :(得分:11)

显然Threshold方法比Smooth更繁琐 - 它只适用于8位整数/ 32位浮点数组(参见here),因此上面的代码片段不起作用,因为numpy数组默认为float64。

因此,如果更改创建数组的行以强制精度为32位浮点数

>>> a = np.array(np.random.rand(1024,768),dtype=‘float32’)

然后很高兴达到门槛:

>>> ((a>0) & (a<1)).sum()
786432
>>> cv.Threshold(a,a,0.5,1,cv.CV_THRESH_BINARY)
>>> ((a>0) & (a<1)).sum()
0