2010-10-11 11 views
6

Sto tentando di applicare la funzione Threshold di Opencv a una matrice numpy. Sto usando i collegamenti Python per opencv 2.1. Va in questo modo:Applicare la soglia di apertura a una serie numpy

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

e questo genera un errore:

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

Quindi, io non sono convinto io so quello che sto facendo, ma speravo Threshold funzionerebbe come, per esempio, Smooth, in cui posso eseguire

cv.Smooth(a,a) 

senza problemi, e finire con un'immagine liscio (ER). Non sono sicuro di come pensare ai "formati" di array numpy come li vedono opencv, ma sono dispiaciuto di convertire la matrice numpy in un formato immagine opencv se non devo (e tutti i miei tentativi sono falliti così lontano comunque).

Mi piacerebbe sapere perché Threshold non funziona nel modo ovviamente ingenuo che sto cercando di farlo funzionare, e sarebbe bello sapere cosa dovrei fare invece.

P.S. So che potrei eseguire un'operazione di soglia sull'array numpy, ma sto cercando di capire come funziona.

risposta

10

Apparentemente il metodo Threshold è più pignolo di Smooth - funziona solo su array a 8 bit in virgola mobile/32 bit in virgola mobile (vedere here) in modo che lo snippet di codice sopra non funzioni perché gli array di numpy sono impostati su float64.

Quindi, se si cambia la linea in cui si crea la matrice di forzare la precisione a 32 bit a virgola mobile

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

allora è felice di soglia:

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