2017-07-25 5 views

答えて

1

Mikiが示唆するように、cv2.reduceを利用することができます。

  1. 使用numpy.where他の強度を黒画素であった1、及び0を含むマスクを作成します。

  2. cv2.reduceを2回(1軸につき1回)呼び出し、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あなたは配列の0でない要素を数える関数を見つけることができます。その場合、行または列になります。

cv2.countNonZero(src) → retval 

PS:この関数は、あなたがしたすべては、画素数(解像度や行* colsの)からその数を引くあり、非黒画素の数を返します。

関連する問題