クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

物体の数え方とラベリング

このレッスンのあとで: マスクのつながったかたまりを数え、物体の数と大きさを求められる。

80分のレッスンコマンド3件コンピュータビジョンラボ:JupyterLab でピクセル、しきい値、物の数え方

ラベリングで物体の数を数える

ラベリングとは、画像のつながった白いかたまりに、1つずつ番号を付ける方法です。付けた番号の最大が、物体の数になります。

レジのトレーの写真から、硬貨の枚数を自動で数えるときも、この方法を使います。かたまりごとの大きさも分かるので、硬貨の種類まで分けられます。

このレッスンのゴール

メモ

マスクのつながったかたまりを数え、物体の数と大きさを求められる。

キーワード

ことばいみ
連結領域1 がつながってできた、1つのかたまり
ラベリングかたまりごとに番号を付けること
4近傍上下左右の4つだけを、隣とみなす考え方
8近傍斜めも入れた8つを、隣とみなす考え方
面積かたまりを作るピクセルの数
テンプレート画像の中から探す、小さな部品の画像

学生が入力するセルは、このプレビューでは空白です。

隣り合う 1 のかたまりが1つの物体

マスクの 1 が隣り合ってつながると、1つのかたまりになります。これを連結領域と呼びます。かたまりが1つの物体です。

どこまでを隣とするかには、2つの決め方があります。上下左右だけの4近傍と、斜めも入れた8近傍です。

例: 5×7 のマスクの 1 と 0

行値
1行目1 1 0 0 0 1 0
2行目0 1 0 0 0 1 1
3行目0 0 0 1 0 0 0
4行目1 0 0 0 1 0 0
5行目1 0 0 0 0 0 1

学生が入力するセルは、このプレビューでは空白です。

4近傍と8近傍で、数が変わる

この格子で、3行目の 1 と、4行目の 1 は、斜めに触れています。4近傍では別々の物体で、全部で 6 個です。8近傍では1つにつながり、5 個です。

scikit-image の label は、初期設定が8近傍です。connectivity=1 を付けると4近傍になります。

斜めの2点を、2通りで数える

コマンド
docker exec jupyter python3 -c "import numpy as np; from skimage import measure; g = np.array([[1,0],[0,1]]); print(measure.label(g).max(), measure.label(g, connectivity=1).max())"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

ラボでコインの数を数える

次のスクリプトは、しきい値 100 でコインの画像をマスクにして、かたまりに番号を付けます。番号の最大と、かたまりごとの面積を表示します。

出力は英語です。objects found は見つけた物体の数、areas in pixels は、ピクセルで表した面積です。

コインの数と面積を調べる

コマンド
docker exec jupyter python3 steps/count.py

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

9個で、大きさは3種類

物体は 9 個です。画像にコインを9枚描いたので、数が合っています。面積は、657 が3つ、1313 が3つ、2553 が3つです。

面積が3つに分かれるので、小、中、大の3種類のコインがあると分かります。

上下左右の隣を調べる

コード: python
rows = 3
columns = 4
row = 0
column = 0
neighbours = []
for step in [[-1, 0], [1, 0], [0, -1], [0, 1]]:
    r = row + step[0]
    c = column + step[1]
    if 0 <= r < rows and 0 <= c < columns:
        neighbours.append([r, c])
print("上下左右の隣:", neighbours)
# row を 1、column を 1 に変えて、もう一度実行します。
# 隣は、いくつになりますか。

テンプレートで、画像の中の部品を探す

テンプレートマッチングは、小さな部品の画像を、大きな画像のすべての位置に当てて、どこがいちばん似ているかを探す方法です。似ている度合いが点数で、1.0 が完全な一致です。

ラボのスクリプトは、コインの画像の一部を切り出し、その場所を探させます。出力の best match は、いちばん似た位置、match score は点数です。

切り出した部品の場所を探す

コマンド
docker exec jupyter python3 steps/find.py

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

よくある間違い

注意

4近傍と8近傍は、同じ数になると考えがちです。斜めにだけ触れる2つは、4近傍では2個、8近傍では1個です。数える前に、どちらにするかを決めて、書いておきます。

このラボとソースについて: コンピュータビジョンラボ:JupyterLab でピクセル、しきい値、物の数え方

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。