对numpy数组应用opencv阈值

9 投票
1 回答
7584 浏览
提问于 2025-04-16 05:18

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

撰写回答