2017-07-25 46 views

回答

1

正如三木建議,你可以利用cv2.reduce

  1. 使用numpy.where創建包含1其中黑色像素是,並且0用於任何其它強度的掩模。

  2. 現在調用cv2.reduce兩次(每個軸一次),執行REDUCE_SUM,並將輸出數據類型設置爲32位整數。

代碼:

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() 

輸出示例:

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你可以找到countNonZero函數計算數組中的非零元素,在你的情況下,它將是一個行或一列。

cv2.countNonZero(src) → retval 

PS:該函數將返回非黑色像素的數量,所有你所要做的就是減去這個數字從像素數(分辨率或行*的cols)。

相關問題