今日は、画像のエッジ検出と、検出されたエッジを画面に表示することについて学習します。
エッジ検出ってなんだろう?
始める前に、エッジ検出とは何かを理解しましょう。
エッジ検出は、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でエッジを検出する方法について学びました。別の画像を使って、同じことを試してみてください。
お読みいただきありがとうございました。