しきい値で背景と物体を分ける
しきい値とは、ピクセルを「明るい」と「暗い」に分けるための、境目の明るさです。しきい値で分けると、背景から物体だけを取り出せます。
レジのカメラが、トレーの上の硬貨を数えるときも、まずこの分け方から始まります。ヒストグラムを見れば、境目をどこに置くかが分かります。
このレッスンのゴール
メモ
ヒストグラムを見てしきい値を選び、背景から物体を分けられる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| ヒストグラム | 明るさごとの、ピクセルの数を数えた表 | |
| しきい値 | 明るいと暗いを分ける、境目の明るさ | 100 |
| 二値化 | 各ピクセルを、2つの値のどちらかにすること | |
| マスク | 二値化の結果。物体が 1、背景が 0 の格子 | |
| 背景 | 調べたい物体のまわりの、何もない部分 | |
| 物体 | 画像の中で、取り出したいもの |
学生が入力するセルは、このプレビューでは空白です。
ヒストグラムは明るさごとの数
ヒストグラムは、画像のピクセルを明るさで分け、グループごとに数を数えた表です。画像の明るさが、どう偏っているかが一目で分かります。
ラボのコインの画像を、4つの帯に分けると、次の数になります。
例: コインの画像の4つの帯
| 明るさの帯 | ピクセルの数 | 中身 |
|---|---|---|
| 0 から 63 | 63231 | 暗い背景 |
| 64 から 127 | 0 | 何もない |
| 128 から 191 | 13566 | 明るいコイン |
| 192 から 255 | 3 | ほんの少しの強い光 |
学生が入力するセルは、このプレビューでは空白です。
真ん中の空いた帯に、しきい値を置く
暗い背景と明るいコインの間に、ピクセルが1つもない帯があります。しきい値は、この空いた帯に置くと、背景とコインをきれいに分けられます。
4つの数を足すと、全部のピクセルになります。次のコマンドで確かめます。
4つの帯の数を足す
docker exec jupyter python3 -c "print(63231 + 0 + 13566 + 3)"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
しきい値より明るければ1、そうでなければ0
二値化は、各ピクセルを、しきい値と比べるだけです。しきい値より明るければ1、そうでなければ0にします。
結果の 0 と 1 の格子がマスクです。ラボのスクリプトは、しきい値を 30、100、160 の3つで試し、数を出します。出力の keeps は「残す」、pixels of は「全体のうち」の意味です。
3つのしきい値を試す
docker exec jupyter python3 steps/threshold.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
3つのしきい値の結果
| しきい値 | 残るピクセル | どうなったか |
|---|---|---|
| 30 | 58806 | 背景のむらまで、残ってしまう |
| 100 | 13569 | コインだけが残る |
| 160 | 10062 | コインの一部まで、削られる |
学生が入力するセルは、このプレビューでは空白です。
100 で残った割合を求める
docker exec jupyter python3 -c "print(round(13569 / 76800 * 100, 1))"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
しきい値より明るい数を数える
grid = [[30, 35, 40], [32, 200, 210], [34, 205, 198]]
level = 100
count = 0
for row in range(len(grid)):
for column in range(len(grid[0])):
if grid[row][column] > level:
count = count + 1
print("しきい値", level, "より明るいピクセル:", count)
# level を 199 に変えて、もう一度実行します。
# 数はいくつになりますか。
よくある間違い
注意
真ん中の 128 を、いつでも正しいしきい値と考えがちです。しかし、コインの画像で 160 にすると、残るのは 10062 に減りました。いつも、ヒストグラムを見てから決めます。