2010-10-11 15 views
6

Próbuję zastosować funkcję opencv Threshold do tablicy numpy. Używam powiązań Pythona dla opencv 2.1. To idzie tak:Zastosuj próg opencv do tablicy numpy

import cv 
import numpy as np 
a = np.random.rand(1024,768) 
cv.Threshold(a,a,0.5,1,cv.CV_THRESH_BINARY) 

a to generuje błąd:

OpenCV Error: Unsupported format or combination of formats() in threshold 

Tak, nie jestem przekonany, wiem, co robię, ale miałem nadzieję Threshold będzie działać jak na przykład Smooth, w którym można uruchomić

cv.Smooth(a,a) 

bez problemów, a kończy się z gładkiej (eR) obrazu. Nie jestem pewien, jak myśleć o "formatach" numpy tablic jak widzi je opencv, ale nie lubię konwertować tablicy numpy do formatu obrazu opencv, jeśli nie muszę (i wszystkie moje próby zawiodły tak i tak daleko).

Chciałbym wiedzieć, dlaczego Threshold nie działa w sposób oczywiście naiwny, próbuję sprawić, aby działało, i byłoby świetnie wiedzieć, co powinienem robić zamiast tego.

P.S. Wiem, że sam mogłem przeprowadzić operację progowania w tablicy numpy, ale próbuję znaleźć opencv.

Odpowiedz

10

Najwyraźniej metoda Threshold jest bardziej wybredna niż gładka - działa tylko na 8-bitowych liczbach całkowitych/32-bitowych tablicach zmiennoprzecinkowych (patrz here), więc powyższy fragment kodu nie będzie działał, ponieważ numpy tablice domyślnie są ustawione na float64.

Więc jeśli zmienić linię, gdzie utworzyć tablicę zmusić do 32 bitowej precyzji pływaka

>>> a = np.array(np.random.rand(1024,768),dtype=‘float32’) 

wtedy jest szczęśliwy, próg:

>>> ((a>0) & (a<1)).sum() 
786432 
>>> cv.Threshold(a,a,0.5,1,cv.CV_THRESH_BINARY) 
>>> ((a>0) & (a<1)).sum() 
0