[再現] OpenCV-Pythonシリーズのキャニーエッジ検出(25)

前のチュートリアルで説明したラプラシアンオペレーターは、本質的に画像のエッジ検出ですが、ラプラシアンオペレーターには一定の制限があり、複雑な画像のエッジ検出にはやや不十分であることがわかりました。今回は、OpenCV-Cannyアルゴリズムで決定的な位置を占めるエッジ検出を紹介します。

これまでに学習したように、エッジ検出アルゴリズムには通常4つのステップがあります。

(1)フィルタリング:エッジ検出アルゴリズムは主に画像強度の1次および2次導関数に基づいていますが、導関数の計算はノイズに非常に敏感であるため、ノイズ関連のエッジ検出器のパフォーマンスを向上させるためにフィルターを使用する必要があります。ノイズを低減する一方で、ほとんどのフィルターもエッジ強度の損失を引き起こすため、エッジの強調とノイズの低減の間にはトレードオフがあります。

(2)強調:エッジ強調の基本は、画像の各点の近傍強度の変化値を決定することです。拡張アルゴリズムは、近傍(または局所)強度値が大幅に変化するポイントを強調表示できます。エッジの強調は通常、勾配の大きさを計算することによって行われます。

(3)検出:画像には比較的大きな勾配振幅を持つ多くのポイントがあり、これらのポイントは特定のアプリケーションフィールドのすべてのエッジではないため、エッジポイントであるポイントを特定するためにいくつかの方法を使用する必要があります。最も単純なエッジ検出基準は、勾配振幅しきい値基準です。

(4)ポジショニング:アプリケーションの状況でエッジ位置の決定が必要な場合は、サブピクセル解像度でエッジ位置を推定でき、エッジ位置も推定できます。

エッジ検出アルゴリズムでは、最初の3つのステップが非常に一般的です。これは、ほとんどの場合、エッジが画像内の特定のピクセルの近くに表示されることを示すためにエッジ検出器のみが必要ですが、エッジの正確な位置または方向を示す必要はないためです。エッジ検出エラーは、通常、エッジの誤分類エラーを指します。つまり、偽のエッジはエッジとして識別されて保持され、真のエッジは偽のエッジとして識別されて削除されます。エッジ推定誤差は、確率統計モデルを使用して、エッジの位置と方向の誤差を記述します。エッジ検出エラーとエッジ推定エラーは、計算方法が完全に異なり、エラーモデルも完全に異なるため、区別します。

キャニーエッジ検出アルゴリズム

John Cannyは1986年にCanny演算子を提案しました。これは、マー(LoG)エッジ検出方法に似ており、最初に平滑化してから導関数を取得する方法にも属しています。このセクションでは、上記のエッジ検出プロセスに基づくキャニー検出アルゴリズムの原理を紹介します。

1.グレースケール

Cannyアルゴリズムは通常グレースケール画像を処理するため、カメラがカラー画像を取得する場合は、最初にグレースケール化する必要があります。カラー画像をグレースケールにするには、画像の各チャネルのサンプル値に従って加重平均を実行します。RGB形式のカラー画像を例にとると、グレースケールに使用される主な方法は次のとおりです。

方法1:グレー=(R + G + B)/ 3

方法2:グレー= 0.299R + 0.587G + 0.114B;(このパラメーターは人間の目の生理学的特性を考慮に入れています)

注1:他の形式のカラー画像については、対応する変換関係に従ってRGBに変換してからグレースケールすることができます。

注2:プログラミング時には、画像形式のRGBの順序が通常BGRであることに注意してください。

2.ガウスフィルタリング

f(x、y)がデータ(入力ソースデータ)を示し、G(x、y)が2次元ガウス関数(畳み込みオペランド)を示し、fs(x、y)が畳み込みによって平滑化された画像を示します。
ここに画像の説明を挿入
ここに画像の説明を挿入

推測プロセス:

座標点(x、y)を使用して3x3の近傍を表し、中心点の座標を(0、0)に設定します。
ここに画像の説明を挿入

重み行列を計算します。分散σ2= 0.64の値を設定し、対応する座標点(x、y)を2次元ガウス公式G(x、y)に取り込み、重み行列を取得し、重み行列を正規化します(行列の各点を重みの合計)を使用して、標準の重み行列、つまりガウステンプレートを取得します。
ここに画像の説明を挿入

ガウスぼかしを計算します。画像の3×3領域に設定し、各ピクセルのグレー値に対応するポイントの重みを掛けます。
ここに画像の説明を挿入
ここに画像の説明を挿入

  • 得られた9つの値の合計は、中心点のガウスぼかし値です。
    ここに画像の説明を挿入

簡単に言えば、Guessテンプレートを使用して、元の画像にシフト、乗算、追加するプロセスです。

3.振幅画像と角度画像を計算する

変化率を計算するとき、1変数関数、つまり導関数の場合、2関数の場合、偏導関数。デジタル画像処理では、一次有限差分を使用して、グレー値の勾配値(変化率)を近似します。

例:ポイントのX方向とY方向の勾配の大きさと方向を計算する
ここに画像の説明を挿入

上の画像は、拡大された直線のエッジ線分を示しています。各正方形はピクセルを表しています。正方形は、ポイントでのエッジの大きさと方向を強調するために使用されています。グレーのピクセル値を0に、白のピクセル値を1に設定します。

図に示すように、点を中心とする3×3近傍は、プレウィット畳み込みテンプレートを使用して計算されます。
ここに画像の説明を挿入

x方向とy方向の畳み込みテンプレートによると、3x3近傍では、下の行のピクセル値から上の行のピクセルを減算して、x方向の偏微分(勾配)を取得します。同様に、右の列のピクセル値を減算します。左の列のピクセルは、y方向の偏微分を取得します。

X方向の勾配:
ここに画像の説明を挿入

y方向の勾配:
ここに画像の説明を挿入

これから、この時点での勾配の大きさと方向を取得できます。
ここに画像の説明を挿入

次の図は、中心点の勾配ベクトル、方位角、およびエッジ方向を示しています。(任意の点のエッジは勾配ベクトルに直交しています):
ここに画像の説明を挿入

キャニー演算子の畳み込みテンプレートは次のとおりです
ここに画像の説明を挿入
ここに画像の説明を挿入
。4.振幅画像の非最大抑制

最初に、下の図に示すように、角度を4つの方向に分割します。水平(0°)、-45°、垂直(90°)、+ 45°。
ここに画像の説明を挿入

  • 次に、3x3エリアの4つの基本エッジ方向の非最大抑制について説明します。
    ここに画像の説明を挿入

方法:中心点(つまり、アクセスポイント)がその方向に沿った近傍で最大の勾配振幅を持つ場合はそれを維持し、そうでない場合は抑制します。

5.二重しきい値検出とエッジ接続

係数THおよびTLを選択します。比率は2:1または3:1です。(一般的にTH = 0.3または0.2、TL = 0.1とする);

非最大抑制後の画像の最大勾配振幅が取り出され、高しきい値と低しきい値が定義されます。つまり、TH×Max、TL×Max(もちろん、自分で設定できます)。

低しきい値未満のポイントを破棄して0を割り当て、すぐに高しきい値よりも大きいポイントにマークを付け(これらのポイントはエッジポイントです)、1を割り当てます。

高しきい値より小さく、低しきい値より大きいポイントは、8連結領域を使用して決定されます(つまり、それらはTHピクセルに接続され、エッジポイントになり、1が割り当てられた場合にのみ受け入れられます)。

次に、関数プロトタイプを見てみましょう。

エッジ= cv2.Canny(画像、しきい値1、しきい値2 [、エッジ[、アパーチャサイズ[、L2勾配]]])

必須パラメーター:

最初のパラメータは処理される元の画像であり、単一チャネルのグレースケール画像でなければなりません。

2番目のパラメーターはしきい値1です。

3番目のパラメーターはしきい値2です。

大きい方のしきい値2は、画像内の明らかなエッジを検出するために使用されますが、一般的に、検出効果はそれほど完璧ではなく、エッジ検出は断続的です。したがって、現時点では、小さい方の最初のしきい値を使用して、これらの不連続エッジを接続します。

オプションのパラメーターの開きサイズは、ソーベル演算子のサイズです。L2gradientパラメータはブール値です。trueの場合、より正確なL2ノルムが計算に使用されます(つまり、2つの方向の逆数の2乗の合計が開かれます)。それ以外の場合、L1ノルムが使用されます(2つの方向の導関数の絶対値は直接です)値が追加されます)。

次にコードを見てみましょう。

view plaincopy to clipboardprint?
import cv2  
import numpy as np  
  
img = cv2.imread("credit_card_.png",0)  
dst = cv2.Canny(img,150,200)  
cv2.imshow("img",img)  
cv2.imshow("res",dst)  
  
cv2.waitKey(0)  
cv2.destroyAllWindows()  

ここに画像の説明を挿入

効果が非常に良く、カードのデジタルエッジが正確に識別されていることがわかります。誰もがキャニーエッジ検出に精通している必要があります。非常に重要な役割があります。

記事の概要ページを確認してくださいhttps://blog.csdn.net/weixin_44237705/article/details/107864965
openvinoの技術情報はグループで交換できます〜
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_44237705/article/details/108441332