2017-07-25 103 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)。

相关问题