記事のディレクトリ
OpenCV-Python:OpenCVでのIV画像処理
19キャニーエッジ検出
目標
•キャニーエッジ検出の概念を理解する
•学習関数cv2.Canny()
19.1原則
キャニーエッジ検出は、1986年にジョンF.キャニーによって提案された非常に人気のあるエッジ検出アルゴリズムです。これは多くのステップで構成されるアルゴリズムであり、次にステップバイステップで紹介します。
19.1.1ノイズ除去
エッジ検出はノイズの影響を受けやすいため、最初のステップは5x5ガウスフィルターを使用してノイズを除去することです。これはすでに学習済みです。
19.1.2画像勾配の計算
Sobel演算子を使用して、平滑化された画像の水平方向と垂直方向の一次導関数(画像勾配)(GxとGy)を計算します。得られた2つの勾配マップ(GxとGy)に従って、境界の勾配と方向を見つけます。式は次のとおりです。
勾配の方向は常に境界に垂直です。グラデーションの方向は、垂直、水平、2つの対角線の4つのカテゴリに分類されます。
19.1.3非最大抑制
グラデーションの方向とサイズを取得した後、画像全体のスキャンを実行して、これらの非境界点を削除する必要があります。各ピクセルをチェックして、このポイントの勾配が、同じ勾配方向を持つ周囲のポイントの中で最大であるかどうかを確認します。以下に示すように:
あなたが今得ているのは、「狭い境界」を持つバイナリ画像です。
19.1.4ヒステリシスしきい値
ここで、これらの境界が実際の境界であることを確認する必要があります。このとき、minValとmaxValの2つのしきい値を設定する必要があります。画像のグレー勾配がmaxValよりも高い場合、それは真の境界と見なされ、minValよりも低いものは破棄されます。両者の間にある場合は、真であると判断された境界点に接続されているかどうかによって異なります。接続されている場合は境界点と見なされ、接続されていない場合は破棄されます。以下に示すように:
Aはしきい値maxValよりも高いため、真の境界点です。CはmaxValよりも低く、minValよりも高く、Aに接続されていますが、真の境界点とも見なされます。また、BはmaxValよりも低いだけでなく、真の境界点に接続されていないため、破棄されます。したがって、適切なmaxValとminValを選択することは、良い結果を得るために非常に重要です。
このステップでは、境界がすべて長い線分であると想定しているため、いくつかの小さなノイズポイントも削除されます。
19.2OpenCVでのキャニー境界の検出
上記の手順を完了するには、OpenCVで必要な関数はcv2.Canny()の1つだけです。
この関数の使い方を見てみましょう。この関数の最初のパラメーターは入力画像です。2番目と3番目はそれぞれminValとmaxValです。3番目のパラメーターは、画像勾配の計算に使用されるSobel畳み込みカーネルのサイズを設定します。デフォルト値は3です。最後のパラメーターはL2gradientで、これを使用して勾配方程式を設定できます。Trueに設定すると、上記の式が使用されます。それ以外の場合は、式が使用されます。代わりに、デフォルト値はFalseです。
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('messi5.jpg',0)
edges = cv2.Canny(img,100,200)
plt.subplot(121),plt.imshow(img,cmap = 'gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(edges,cmap = 'gray')
plt.title('Edge Image'), plt.xticks([]), plt.yticks([])
plt.show()
結果:
私の結果
公式結果
その他のリソース
- ウィキペディアのキャニーエッジ検出器
- ビルグリーンによるキャニーエッジ検出チュートリアル、2002年。
詳細については、公式アカウントに注意してください。