※ replitで「You've used up all your Development time」というメッセージが出た人は
こちらを参考にして新しくreplitのアカウントを作ってください。
※ 本題に入る前に、必ず動画の
連絡
を見てください。
- リサイズとグレースケール化
- X方向のソーベルフィルタ
- Y方向のソーベルフィルタ
- 検出結果の合成
- Canny法によるエッジ検出
元画像の選定
今回の課題2, 3ではX方向の明度の差、Y方向の明度の差をもとに、それぞれ縦方向、横方向のエッジを取り出す。
この結果を確認するため、「ほぼ鉛直」「ほぼ水平」向きのエッジを両方とも含んだものを元画像として使用する。
(これは解説動画で使っているものなので、課題でこの画像は使わないこと)
X方向のソーベルフィルタ
以下のような3x3の配列を考える。これはX方向のソーベルフィルタのマスクと呼ばれるもの。
それぞれのピクセルで、「そのピクセルを囲む9個のピクセルの明るさとマスクの値をかけて足し合わせる」という処理を行うと、
たとえば下図の赤枠のエリアでは左側が暗く右側が明るいため、正の値になる。
青枠のエリアではその逆なので負の値になる。
緑枠のエリアではどこも同じ明るさなので総和は0になる。
要するに、縦向きのエッジ部分が白く、それ以外が黒になる。

OpenCVでの書式は以下の通り。
cv2.Sobel(image, cv2.CV_32F, 1, 0, ksize=3)
結果としてこのような画像が得られる。
Y方向のソーベルフィルタ
Y方向のソーベルフィルタのマスクは以下のようなもの。
X方向のマスクと比べて縦横が逆になった形なので、このマスクで同様の処理を行うと横向きのエッジ部分が白く、それ以外が黒になる。
OpenCVでの書式は以下の通り。
cv2.Sobel(image, cv2.CV_32F, 0, 1, ksize=3)
結果としてこのような画像が得られる。
2つのソーベルフィルタの合成
2つの処理で得られる明るさを2乗して平方根を取ると、縦横両方のエッジが白くなる。
2つの処理それぞれでは薄くなっていた斜めのエッジも同等の明るさになる。
Canny法によるエッジ検出
OpenCVのライブラリを使うと、Canny法によるエッジ検出ができる (
ドキュメント)。
書式は以下の通り。
cv2.Canny(image, 100, 200)
大雑把にいうと、ソーベルフィルタの合成結果を高さとして考えたときに、山脈の「尾根」にあたる部分を白として取り出す処理を行う。
第3引数はどれだけ尖っていたら白と判定するかという閾値にあたる。
第2引数はその白の線の連続を許すかどうかの閾値。
これらを調整することで望む部分のエッジを適切に取り出すことができる。