对numpy数组应用opencv阈值
我正在尝试将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
在我这种明显简单的用法下不工作,知道我应该怎么做会很好。
附言:我知道我可以自己对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