もし無理なようでしたら、黒で塗りつぶされた領域をカウントしないプログラムを教えていただきたいです。
カウントしたいなら、値が 255 のピクセルを数えればいいのではないでしょうか。
python
1# encoding: utf-8
2import matplotlib.pyplot as plt
3import cv2
4import numpy as np
5
6img = cv2.imread('rei.png', 0) # グレースケールで読み込む。
7
8print(np.unique(img)) # [ 0 255]
9
10h, w = img.shape
11num_white = cv2.countNonZero(img)
12num_black = h * w - num_white
13print('number of white pixels', num_white) # number of white pixels 417
14print('number of black pixels', num_black) # number of black pixels 87
追記
以下のように斜めになっている輪郭線が別々の輪郭であると認識されてしまうのが問題のようで、findContours() のアルゴリズムをいくつか選んでみましたが、うまくいきませんでした。
今回のように幅が1ピクセルしかないような輪郭線の場合、findContours は向いていないと思います。膨張演算で線の幅を太くすると、うまくいくと思いますが、右上の小さい穴が消えてしまいますね。
4連結でラベリングし、背景ラベルを除くことで、一応白い領域の数は取得できました。
python
1import cv2
2import numpy as np
3import matplotlib.pyplot as plt
4
5# 画像をグレースケール形式で読み込む。
6src = cv2.imread('ttt.png')
7
8# 連結成分のラベリングを行う。
9gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
10num_labels, labels = cv2.connectedComponents(gray, connectivity=4)
11
12# ラベリング結果
13print('number of labels', num_labels)
14print('number of white region', num_labels - 1) # 背景ラベルを除く
15print(labels.shape, labels.dtype) # (362, 420) int32
16
17# ラベルに応じて、色をつけた画像を作成する。
18dst = np.zeros_like(src)
19dst[labels == 0] = [255, 255, 0] # 背景ラベル 水色
20dst[labels == 1] = [0, 255, 0] # ラベル1 緑
21dst[labels == 2] = [0, 0, 255] # ラベル2 赤
22dst[labels == 3] = [0, 255, 255] # ラベル3 黄色
23dst[labels == 4] = [255, 0, 255] # ラベル4 紫
24dst[labels == 5] = [152, 145, 234] # ラベル5 ピンク
25dst[labels == 6] = [100, 100, 100] # ラベル6 グレー
26
27plt.imshow(cv2.cvtColor(dst, cv2.COLOR_BGR2RGB))
28plt.show()
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/16 23:52
2018/09/17 11:35
2018/09/18 05:47