今日は、画像のエッジ検出と、検出されたエッジを画面に表示することについて学習します。
エッジ検出ってなんだろう?
始める前に、エッジ検出とは何かを理解しましょう。
エッジ検出は、1つの画像内の様々なオブジェクトの境界/エッジを見つけるために使用されます。
エッジ検出には様々なアルゴリズムや技術がありますが、最も一般的で広く使われているアルゴリズムの一つが「カニーエッジ検出器」です。
必要なモジュールのインポート
まず最初に、必要なモジュール、すなわちOpenCV、numpy、matplotlibをすべてインポートします。また、好みに応じてスタイルを設定することになります。
|
1
2
3
4
|
import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('seaborn')
|
画像の読み込みとプロット
画像を検出する前に、 imread メソッドを用いてプログラムから画像を読み込む必要があります。このメソッドは、画像のパスをパラメータとして受け取ります。
オリジナルの色を得るためには、 cvtColor 関数で色を RGB 形式に変換し、読み込んだ画像に適用する必要があります。
画像は、プロジェクトコードファイルと同じフォルダにあることを確認してください。
|
1
2
|
loaded_image = cv2.imread("image.jpg")
loaded_image = cv2.cvtColor(loaded_image,cv2.COLOR_BGR2RGB)
|
画像を読み込むために、matplotlib ライブラリを使用します。そのためのコードは以下の通りです。
まず、よりよく見えるように図のサイズを設定し、次に imshow メソッドを使って画像を描画します。これに加えて、明確なプロットを得るために軸をオフにすることにします。
そのためのコードを以下に示します。
|
1
2
3
4
|
plt.figure(figsize=(10,10))
plt.imshow(loaded_image,cmap="gray")
plt.axis("off")
plt.show() |
画像をグレースケールに変換する
画像に Canny エッジ検出器を適用する前に,関数 cvtColor を用いて画像をグレースケールに変換する必要があります. そして,元の画像と同じように画像をプロットします.
|
1
2
3
4
5
|
gray_image = cv2.cvtColor(loaded_image,cv2.COLOR_BGR2GRAY)
plt.figure(figsize=(10,10))
plt.imshow(gray_image,cmap="gray")
plt.axis("off")
plt.show() |
この記事もチェック:PythonとOpenCVを使って画像分割|二値化やグレースケールの変換等を解説
エッジ検出のためのCannyアルゴリズムのPythonへの適用
最後に、前のステップで取得したグレースケール画像に対してCanny Algorithmを適用します。そのためのコードを以下に示します。
|
1
|
edged_image = cv2.Canny(gray_image, threshold1=30, threshold2=100)
|
Canny` 関数は、グレースケール画像、考慮すべきピクセルの閾値の下限値と上限値、の3つを必要とします。
次に、エッジ検出された画像をプロットする必要があります。そのためのコードを以下に示す。
|
1
2
3
4
|
plt.figure(figsize=(10,10))
plt.imshow(edged_image,cmap="gray")
plt.axis("off")
plt.show() |
参考までに、3つのプロットを以下に表示します。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('seaborn')
loaded_image = cv2.imread("image.jpg")
loaded_image = cv2.cvtColor(loaded_image,cv2.COLOR_BGR2RGB)
gray_image = cv2.cvtColor(loaded_image,cv2.COLOR_BGR2GRAY)
edged_image = cv2.Canny(gray_image, threshold1=30, threshold2=100)
plt.figure(figsize=(20,20))
plt.subplot(1,3,1)
plt.imshow(loaded_image,cmap="gray")
plt.title("Original Image")
plt.axis("off")
plt.subplot(1,3,2)
plt.imshow(gray_image,cmap="gray")
plt.axis("off")
plt.title("GrayScale Image")
plt.subplot(1,3,3)
plt.imshow(edged_image,cmap="gray")
plt.axis("off")
plt.title("Canny Edge Detected Image")
plt.show() |
エッジ検出の最終コード

別の画像の出力は以下のようになります。

まとめ
この記事では、Pythonでエッジを検出する方法について学びました。別の画像を使って、同じことを試してみてください。
お読みいただきありがとうございました。