将opencv阈值应用于numpy数组

Mik*_*war 7 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)
Run Code Online (Sandbox Code Playgroud)

这会抛出一个错误:

OpenCV Error: Unsupported format or combination of formats () in threshold
Run Code Online (Sandbox Code Playgroud)

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

cv.Smooth(a,a)
Run Code Online (Sandbox Code Playgroud)

没有任何问题,最终得到一个平滑的(呃)图像.我不知道如何思考numpy的阵列作为OpenCV中看到他们"格式",但我厌恶的numpy的数组转换成OpenCV的图像格式,如果我没有(和我所有的尝试都失败了这样无论如何).

我想知道为什么Threshold没有在我试图使它的工作显然简单的方式工作,这将是伟大的,知道我应该不是做.

PS我知道我可以在numpy的阵列上自己执行阈值操作,但我试图找出OpenCV的.

rro*_*ndd 11

显然这个Threshold方法比Smooth更繁琐 - 它只适用于8位整数/ 32位浮点数组(见这里)所以你的代码片段不起作用,因为numpy数组默认为float64.

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

>>> a = np.array(np.random.rand(1024,768),dtype=‘float32’)
Run Code Online (Sandbox Code Playgroud)

那么它很高兴达到门槛:

>>> ((a>0) & (a<1)).sum()
786432
>>> cv.Threshold(a,a,0.5,1,cv.CV_THRESH_BINARY)
>>> ((a>0) & (a<1)).sum()
0
Run Code Online (Sandbox Code Playgroud)