Ultralytics YOLO27: ウェイトリストに登録する
YOLOのライセンス
Ultralytics用語集に戻る

Canny Edge Detection

Cannyエッジ検出は、ノイズを低減し、明るさの急激な変化を検出して、コンピュータービジョン向けの細いエッジマップを生成する多段階アルゴリズムです。

Cannyエッジ検出は、明るさの急激な変化を特定し、細い2値エッジマップに変換する多段階の画像処理アルゴリズムです。ノイズを低減し、輝度の変化箇所を特定して、信頼できるエッジピクセルを結び付けて輪郭を形成します。コンピュータービジョンでは、こうした輪郭が形状解析や計測のために画像構造を表現します。

John Cannyは1983年にこの手法を開発し、1986年の論文エッジ検出への計算論的アプローチで説明しました。この設計は、実際のエッジを検出すること、位置を正確に特定すること、エッジごとに1つの応答を生成することという3つの目標のバランスを取ります。「Canny edge detector」は、このアルゴリズムの別名です。

Cannyエッジ検出の仕組み#

このアルゴリズムは、データの前処理にフィルタリングと連結性の解析を組み合わせます。5つの段階には、それぞれ異なる役割があります。

  • ノイズ低減: ガウシアン平滑化では、距離に応じた重みで近隣ピクセルを平均し、不要なエッジを生み出す変動を抑えます。
  • 勾配の推定: 水平方向と垂直方向の微分により、明るさの変化速度を測定します。これらを組み合わせることで、エッジの強度と境界に垂直な方向が得られます。OpenCVでは、この段階にSobel微分を使用します。
  • エッジの細線化: 非極大値抑制では、勾配方向に沿った局所的な勾配ピークを保持し、幅の広い帯ではなく細い稜線を生成します。
  • 二重しきい値処理: 高いしきい値で強いエッジを特定し、低いしきい値で弱い応答を除外します。しきい値の間にあるピクセルは候補になります。
  • ヒステリシスによる連結: 候補ピクセルは、ほかの候補ピクセルを介して強いエッジにつながっている場合に保持されます。孤立した候補は除去されます。

しきい値、平滑化、失敗モード#

しきい値は、生の明るさやモデルの信頼度ではなく、勾配の強度に作用します。しきい値を下げると、より多くのディテールとノイズが保持され、上げると弱い境界が除去されます。高しきい値を上げると、ヒステリシスによる連結に使える強いエッジのシードも減少します。

ガウシアンのスケールは、別のトレードオフを制御します。平滑化を強くするとノイズは抑制されますが、細かい構造も失われます。scikit-imageのノイズのある正方形の例では、ガウス標準偏差を変更すると、正方形の周囲にどれだけのノイズが残るかが変わります。

ひび割れ検査では、粗いコンクリート表面によって不要なテクスチャエッジや不完全なひび割れの輪郭が生じます。しきい値を上げると、一部の誤検出エッジを除去できる一方で、実際のひび割れの一部も失われます。

Sobelは輝度の微分を推定します。Cannyは勾配の推定に平滑化、細線化、連結性に基づく選択を組み合わせます。Cannyの細線化段階では隣接ピクセルを比較する一方、物体検出のNMSでは重なり合う予測ボックスを比較します。

PythonでのCannyエッジ検出#

pip install opencv-python numpyで依存関係をインストールします。この例では、OpenCVを使ってバスのサンプル画像のエッジマップを保存します。

from urllib.request import urlopen

import cv2
import numpy as np

with urlopen("https://ultralytics.com/images/bus.jpg") as response:
    encoded = np.frombuffer(response.read(), dtype=np.uint8)
gray = cv2.imdecode(encoded, cv2.IMREAD_GRAYSCALE)

# 輝度勾配を計算する前に画像を平滑化します。
smoothed = cv2.GaussianBlur(gray, (5, 5), 1.4)
edges = cv2.Canny(smoothed, 50, 150, L2gradient=True)
cv2.imwrite("canny_edges.png", edges)

保存されたPNGでは、保持されたエッジが黒い背景に白で表示されます。OpenCVのエッジ検出ワークフローでは、Cannyの2番目と3番目の引数で低しきい値と高しきい値を指定します。L2gradient=Trueはユークリッド勾配の大きさを使用し、デフォルトでは水平方向と垂直方向の微分の絶対値の和を使用します。これらの選択によって勾配の値が変わり、その結果、しきい値の動作も変わります。

Cannyは幾何学的な特徴抽出に利用できます。scikit-imageの直線検出の例では、カメラマンの写真にCannyを適用した後、確率的ハフ変換で直線セグメントを抽出します。Cannyはエッジピクセルを出力し、ハフ投票はそれらをまとめて直線を抽出します。物体検出ではカテゴリとボックスを割り当て、インスタンスセグメンテーションでは個々の物体にピクセルを割り当てます。

UltralyticsのYOLO26セグメンテーションは、物体の切り分けに使うマスクを出力します。このマスクを使って画像領域を選択し、個別にCanny処理を行えます。これにより、学習ベースの物体選択と従来型の境界抽出を組み合わせられます。

生成AIでは、ControlNetがCannyマップを拡散モデルの空間条件として使用します。そのCanny条件付け実装は、抽出した輪郭をテキストプロンプトと併用し、Stable Diffusion 1.5の生成をガイドします。

ソリューションを見る

スポーツにおけるコンピュータービジョン

スポーツにおけるコンピュータービジョン

Ultralytics YOLOが、選手やボールの追跡、パフォーマンス分析、コーチングへの知見、アスリートのリハビリを通じて、スポーツビジョンをどのように支えるかをご紹介します。
詳しく見る
航空画像向けコンピュータービジョン

航空画像向けコンピュータービジョン

Ultralytics YOLOを使用して、ドローンや航空画像をリアルタイムの知見に変換し、農業、水産養殖、自然保護、地理空間分析に活用できます。
詳しく見る
航空宇宙分野のコンピュータービジョン

航空宇宙分野のコンピュータービジョン

Ultralytics YOLOを活用して航空宇宙分野でコンピュータビジョンを導入し、航空機検査、滑走路上のFOD検出、空港の地上業務、複合材の欠陥検出に活用できます。
詳しく見る
セキュリティ分野のコンピュータービジョン

セキュリティ分野のコンピュータービジョン

Ultralytics YOLOモデルであらゆる施設を保護しましょう。ビジョンAIは、周辺監視、脅威検知、ナンバープレート認識、職場の安全管理を支援します。
詳しく見る
ロボティクス分野のコンピュータービジョン

ロボティクス分野のコンピュータービジョン

Ultralytics YOLOモデルで、よりスマートなマシンを実現しましょう。ロボティクスにおけるビジョンAIは、自律ナビゲーション、認識、物体追跡、リアルタイム制御を支援します。
詳しく見る
物流におけるコンピュータービジョン

物流におけるコンピュータービジョン

Ultralytics YOLOモデルで物流を効率化しましょう。ビジョンAIにより、荷物検査、仕分け、車両追跡、倉庫のリアルタイム安全監視を実現します。
詳しく見る
小売業におけるコンピュータービジョン

小売業におけるコンピュータービジョン

Ultralytics YOLOモデルで小売のあり方を変革しましょう。ビジョンAIにより、在庫追跡、棚の監視、行列管理、より高度な顧客インサイトを実現します。
詳しく見る
医療分野におけるコンピュータービジョン

医療分野におけるコンピュータービジョン

Ultralytics YOLOモデルで医療ソリューションを構築しましょう。医療分野のビジョンAIは、医用画像処理の高速化、より高度な診断、患者モニタリングを実現します。
詳しく見る
製造業におけるコンピュータービジョン

製造業におけるコンピュータービジョン

Ultralytics YOLOモデルで製造を最適化しましょう。ビジョンAIは、品質管理、欠陥検出、PPE準拠、組立ラインの自動化を推進します。
詳しく見る
自動車分野におけるコンピュータービジョン

自動車分野におけるコンピュータービジョン

Ultralytics YOLOモデルで自動車分野にコンピュータービジョンを導入しましょう。ビジョンAIは、道路の安全性、運転支援、車両の自動化を向上させ、よりスマートな道路を実現します。
詳しく見る
農業におけるコンピュータービジョン

農業におけるコンピュータービジョン

Ultralytics YOLOモデルでスマート農業にビジョンAIを導入しましょう。作物のモニタリング、家畜の追跡、精密農業を支援し、より高く効率的な収量を実現します。
詳しく見る

AIの未来を一緒に築きましょう!

機械学習の未来に向けた歩みを始めましょう