Применить порог opencv к массиву NumPy - PullRequest
7 голосов
/ 11 октября 2010

Я пытаюсь применить функцию opencv Threshold к массиву numpy.Я использую привязки Python для OpenCV 2.1.Это выглядит так:

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 не работает явно наивным образом, я пытаюсь заставить его работать, и было бы здорово узнать, что я должен делать вместо этого.

PS Я знаю, что мог бы самостоятельно выполнить операцию порогового значения для массива numpy, но я пытаюсь выяснить opencv.

1 Ответ

11 голосов
/ 13 апреля 2011

Очевидно, метод Threshold более суетливый, чем Smooth - он работает только с 8-битными целочисленными / 32-битными массивами с плавающей запятой (см. здесь ), поэтому приведенный выше фрагмент кода не будет работать, потому что массивы массива по умолчанию - 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...