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

無料レッスン

画像のエッジ検出

このレッスンのあとで: 隣のピクセルとの差からエッジの強さを求め、エッジを数えられる。

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

エッジは明るさが急に変わる場所

エッジとは、画像の中で、明るさが急に変わる場所です。エッジを見つけると、物の輪郭や、道路の白線のような形を取り出せます。

車の車線を読むカメラは、暗い路面から白線へ変わる所を探します。その変わり方の大きさを、数で測るのが勾配です。

このレッスンのゴール

メモ

隣のピクセルとの差からエッジの強さを求め、エッジを数えられる。

キーワード

ことばいみ
エッジ明るさが急に変わる場所
勾配隣のピクセルとの、明るさの差
エッジの強さ左右の差と上下の差を合わせた大きさ
輪郭物の形を囲む、エッジのつながり
エッジマップエッジが 1、それ以外が 0 の格子
キャニー法ぼかしてからエッジを細く取り出す方法

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

右と左の差が横の変化を表す

あるピクセルの、右の値から左の値を引くと、横の変化が分かります。下の値から上の値を引くと、縦の変化が分かります。

エッジの強さは、この2つの差の、絶対値を足した数です。絶対値は、マイナスを取った大きさです。

例: 角にあるピクセルの強さ

方向引く値計算差
横右 200、左 10200 - 10190
縦下 10、上 20010 - 200-190
強さ絶対値の和190 + 190380

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

表の強さを求める

コマンド
docker exec jupyter python3 -c "print(abs(200 - 10) + abs(10 - 200))"

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

強さがしきい値以上なら、エッジとする

強さをしきい値と比べると、エッジの格子ができます。しきい値以上なら 1、それより小さければ 0 にします。

その格子が、エッジマップです。1 の数を数えれば、エッジのピクセルがいくつあるかが分かります。

例: 強さの格子をしきい値 100 で分ける

行強さエッジマップ
1行目0 190 190 00 1 1 0
2行目0 190 380 1900 1 1 1
3行目0 0 190 1900 0 1 1

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

ラボの本物の道具でエッジを数える

ここまでの計算は、仕組みを学ぶための簡単な方法です。ラボでは scikit-image の canny を使います。先にぼかし、強さを求め、細い線だけを残します。

出力は英語です。picture pixels は画像のピクセルの数、edge pixels はエッジのピクセルの数です。

図形の画像のエッジを数える

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

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

エッジは画像のほんの一部

図形の画像は 60000 ピクセルで、エッジは 1326 ピクセルです。次のコマンドで、割合を求めます。

スクリプトは、shapes_edges.png も保存します。JupyterLab で開くと、図形の輪郭だけが白い線で残っています。

エッジの割合を求める

コマンド
docker exec jupyter python3 -c "print(round(1326 / 60000 * 100, 1))"

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

1つのピクセルの強さを求める

コード: python
picture = [[10, 10, 200, 200], [10, 10, 200, 200], [10, 10, 200, 200]]
row = 1
column = 1
across = picture[row][column + 1] - picture[row][column - 1]
down = picture[row + 1][column] - picture[row - 1][column]
print("左右の差:", across)
print("上下の差:", down)
print("エッジの強さ:", abs(across) + abs(down))
# picture の 1 行目の2つ目の 10 を 200 に変えて、もう一度実行します。
# 上下の差と、エッジの強さは、どうなりますか。

よくある間違い

注意

ノイズの多い画像でも、そのままエッジを探せると考えがちです。小さな点も明るさが急に変わるので、エッジに数えられます。先にぼかしてから探します。

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

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