2017-07-25 2 views

Antwort

1

Wie Miki vorschlägt, können Sie cv2.reduce nutzen.

  1. numpy.where Verwenden einer Maske enthält 1 wo ein schwarzes Pixel war, und für jede andere 0 Intensität zu erzeugen.

  2. Jetzt zweimal (einmal pro Achse) cv2.reduce aufrufen, REDUCE_SUM ausführen und den Ausgabedatentyp auf eine 32-Bit-Ganzzahl setzen.

Code:

import cv2 
import numpy as np 

# Make random image 
img = np.zeros((128,128),np.uint8) 
cv2.randu(img, 0, 256) 

mask = np.uint8(np.where(img == 0, 1, 0)) 

col_counts = cv2.reduce(mask, 0, cv2.REDUCE_SUM, dtype=cv2.CV_32SC1) 
row_counts = cv2.reduce(mask, 1, cv2.REDUCE_SUM, dtype=cv2.CV_32SC1) 

print "Column counts: ", col_counts.flatten().tolist() 
print "Row counts: ", row_counts.flatten().tolist() 

Beispielausgabe:

Column counts: [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 2, 1, 1, 1, 0, 2, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 2, 0, 1, 1, 1, 0, 0, 2, 1, 3, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 2, 0, 1, 0, 0, 0, 0, 2, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1] 
Row counts: [0, 0, 1, 0, 0, 0, 2, 1, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 2, 0, 0, 0, 1, 1, 2, 2, 2, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 2, 1, 1, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 2, 1, 1, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 2] 
1

Here können Sie countNonZero Funktion finden, die nicht-Null Elemente in einem Array zählt, in Ihrem Fall wird es eine Zeile oder eine Spalte sein.

cv2.countNonZero(src) → retval 

PS: Diese Funktion wird die Anzahl der nicht schwarzer Pixel zurückkehrt, alles, was Sie zu tun haben, ist diese Zahl von der Anzahl der Pixel subtrahieren (Auflösung oder Zeile * cols).

Verwandte Themen