2013-06-04 3 views
7

Qual è il modo più veloce per ottenere il numero di pixel bianchi in un'immagine binaria utilizzando OpenCV? C'è qualcosa di più veloce rispetto all'utilizzo di due cicli for per l'accesso all'immagine pixel per pixel?Il modo più veloce per ottenere il numero di pixel bianchi in un'immagine binaria utilizzando OpenCV

+0

L'immagine è in scala di grigi o è un'immagine binaria? – Aurelius

+0

@Aurelius: In realtà è un'immagine binaria, avrei dovuto scriverlo nella domanda. – xx77aBs

risposta

11

Il modo più sintetico per raggiungere questo obiettivo è:

cv::Mat image, mask; //image is CV_8UC1 
cv::inRange(image, 255, 255, mask); 
int count = cv::countNonZero(mask); 

Se si opera su un'immagine binaria, poi la chiamata a cv::inRange() non è necessaria, e semplicemente cv::countNonZero() sarà sufficiente.

Sebbene qualsiasi metodo debba scorrere tutti i pixel, questo può essere in grado di sfruttare lo parallel_for_() integrato di OpenCV, che consente l'esecuzione parallela.

Se l'immagine è continua, è possibile scorrere tutti i dati utilizzando un singolo ciclo.

+0

Grazie, cv :: inRange è quello che volevo! In realtà sto usando OpenCV attraverso il wrapper EmguCV (in C#), e questa linea ha velocizzato il mio programma per circa il 40%. Hai idea del motivo per cui il loop su due loop è molto più lento? – xx77aBs

+3

Non ho molta familiarità con C#, ma credo che controlli i limiti quando si itera in un ciclo, che potrebbe spiegare alcune delle differenze di prestazioni. – Aurelius

+0

Grazie, il controllo dei limiti sta davvero rallentando le cose. Ma dopo che ho disabilitato il controllo dei limiti, per un'immagine molto grande (10240x7680) la funzione CV richiede circa 70ms e due loop per circa 350ms. Dopo aver usato Parallel.For, l'approccio a due loop ha richiesto circa 200ms, ma è ancora molto più lungo l'implementazione di OpenCV. – xx77aBs