ホームページ  >  記事  >  バックエンド開発  >  Python を使用して画像のエッジを検出する方法

Python を使用して画像のエッジを検出する方法

王林
王林転載
2023-06-03 21:22:011929ブラウズ

エッジ検出

画像エッジとは、オブジェクトの周囲のピクセルのグレースケールの段階的な変化を表す画像内のピクセルのセットを指します。

画像内の異なるグレースケールを持つ 2 つの隣接する領域の接合部では、グレースケールの急速な遷移、またはジャンプが存在する必要があります。それらは、画像内の各領域のエッジの位置に対応しており、エッジは方向、ステップ特性、形状などの固有の情報が豊富に含まれており、エッジに沿ったピクセルはゆっくりと変化しますが、エッジの方向に垂直なピクセルは大幅に変化します。

画像のほとんどの情報はエッジ部分に集中しており、エッジが決定された後、実際に異なる領域の分割が行われます。

エッジ検出演算子

エッジの検出には、多くの場合、いくつかのエッジ検出演算子の助けが必要です。これらの演算子の一部は一次微分に基づいており、一部は二次微分演算子です

Roberts 演算子、Prewitt 演算子、および Sobel 演算子には、x および y 方向のテンプレートが含まれています。各テンプレートは、対応する方向にのみ敏感で、この方向には明らかな出力がありますが、他の方向には敏感ではありません。変化。以下に、一般的な 1 階微分演算子とその特性をいくつか示します。

##演算子名機能##単純な微分演算子はノイズに敏感で、ノイズに対して一定の増幅効果がありますロバーツ演算子ノイズを除去します影響は小さく、単純な微分演算子よりもエッジ検出能力が優れていますPrewitt 演算子はノイズの影響を効果的に抑制し、エッジ点を検出できますSobel オペレーター得られるエッジが広くなり、ノイズ抑制効果が強くなりますCanny オペレーター検出されました エッジ位置は正確で、エッジは狭いです
1、ロバーツ演算子

2、プレウィット演算子

Python を使用して画像のエッジを検出する方法

3. Sobel オペレーター

Sobel オペレーターによって検出されたエッジは、Roberts オペレーターの検出結果よりも連続的であり、画像の検出能力が優れています。さらに、Sobel エッジ検出器では局所平均化が導入されており、ノイズへの影響が少なく、より良い効果が得られます。 Python を使用して画像のエッジを検出する方法

4. Canny オペレーター

Canny によって得られる検出結果は、Roberts および Sobel オペレーターの検出結果よりも優れており、エッジの詳細がより豊富で、エッジの位置が正確です。連続性は良好で、偽エッジはほとんどなく、エッジはすべて 1 ピクセル幅です。 Python を使用して画像のエッジを検出する方法アルゴリズムの実装は次の 4 つのステップに分かれています:

ガウス フィルターを使用して画像を滑らかにする

  • 次の有限導関数を使用します。勾配の大きさと方向を計算するための一次偏微分差分

  • 勾配振幅の非最大抑制を実行します

  • 双対を使用しますエッジを検出して接続するためのしきい値アルゴリズム

  • 5. ラプラス演算子

    一般的な 2 次微分演算子には、2 次チューター演算子であるラプラス演算子が含まれます。画像内のノイズに非常に敏感で、検出されたエッジは多くの場合 2 ピクセル幅で方向情報がないため、ラプラシアン演算子はエッジを直接検出するために使用されることはほとんどありませんが、主にエッジ ピクセルが検出された後にエッジ ピクセルを決定するために使用されます。ピクセルが画像の暗い領域にあるか明るい領域にあるか。さらに、1 次差分演算子は広い範囲で大きな勾配値を形成するため、正確に位置を特定することができませんが、2 次差分演算子のゼロクロス ポイントを使用してエッジを正確に特定できます。
  • ラプラス演算子のノイズはソーベル演算子のノイズよりも明らかに大きいですが、そのエッジはソーベル演算子よりもはるかに薄く、ラプラス変換は 2 次微分演算子として特にノイズの影響を受けやすく、二重の結果が生成されます。エッジがあり、エッジの方向を検出できません。


効果実験

1. Roberts エッジ検出Python を使用して画像のエッジを検出する方法

Prewitt オペレータ コード:

Roberts_kernel_x = np.array([[-1, 0], [0, 1]], dtype=int)
Roberts_kernel_y = np.array([[0, -1], [1, 0]], dtype=int)

2. Prewitt エッジ検出

Python を使用して画像のエッジを検出する方法Prewitt オペレーター コード:

Roberts_kernel_x = np.array([[-1, 0], [0, 1]], dtype=int)
Roberts_kernel_y = np.array([[0, -1], [1, 0]], dtype=int)

3 、Sobelエッジ検出

Python を使用して画像のエッジを検出する方法ソーベル関数:

edges = cv2.Sobel(img, -1, 1, 1)

4、キャニー エッジ検出

Python を使用して画像のエッジを検出する方法キャニー関数:

edges = cv2.Canny(img, 5, 100)

5. ラプラシアン エッジ検出

Python を使用して画像のエッジを検出する方法ラプラシアン関数:

edges = cv2.Laplacian(img, -1)

以上がPython を使用して画像のエッジを検出する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。