PythonとOpenCVを使って画像のエッジ検出をする方法

スポンサーリンク

今日は、画像のエッジ検出と、検出されたエッジを画面に表示することについて学習します。

スポンサーリンク

エッジ検出ってなんだろう?

始める前に、エッジ検出とは何かを理解しましょう。

エッジ検出は、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()

エッジ検出のための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()

エッジ検出の最終コード

Edge Detected Output 1 Compressed
Edge Detected Output 1

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

Edge Detected Output 2 Compresse 1
Edge Detected Output 2

まとめ

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

お読みいただきありがとうございました。

タイトルとURLをコピーしました