将OpenCV阈值应用于NumPy数组

9

我正在尝试将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)

没有问题,最终得到了一张更加平滑的图像。我不确定如何将numpy数组的“格式”视为opencv所见的格式,但如果不必要的话,我不想将numpy数组转换为opencv图像格式(而且我的所有尝试都失败了)。

我想知道为什么Threshold没有按照我尝试让它工作的明显幼稚的方式工作,很棒能知道我应该做些什么。

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

1个回答

12

显然,Threshold 方法比 Smooth 方法更为挑剔 - 它只适用于 8 位整数 / 32 位浮点数数组 (详见 这里),因此你上面的代码片段不起作用,因为 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接