Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

imfindcircles

円のハフ変換を使用した円の検索

説明

centers = imfindcircles(A,radius) は、イメージ A で半径が radius にほぼ等しい円を検索します。出力 centers は、イメージ内にある円の中心の (x,y) 座標を含む 2 列の行列です。

[centers,radii] = imfindcircles(A,radiusRange) は、半径が radiusRange で指定された範囲内にある円を検索します。追加の出力引数 radii には、centers の各円の中心に対応する推定半径を含めます。

[centers,radii,metric] = imfindcircles(A,radiusRange) は、円ごとにアキュムレータ配列のピークの大きさを (降順で) 含む列ベクトル metric も返します。centersradii の行はそれぞれ metric の行に対応します。

[___] = imfindcircles(___,Name,Value) は、上記の任意の構文を用いて、1 つ以上の名前と値の引数をもつ追加オプションを指定します。

すべて折りたたむ

この例では、イメージ内のすべての円を検出する方法と最も強い円を保持および表示する方法を説明します。

グレースケール イメージをワークスペースに読み取って表示します。

A = imread('coins.png');
imshow(A)

Figure contains an axes object. The axes object contains an object of type image.

半径 r が [15, 30] ピクセルの範囲にある円をすべて検出します。

[centers, radii, metric] = imfindcircles(A,[15 30]);

メトリクスの値に従って 5 つの最も強い円を保持します。

centersStrong5 = centers(1:5,:); 
radiiStrong5 = radii(1:5);
metricStrong5 = metric(1:5);

元のイメージ上に 5 つの最も強い円の円周を描画します。

viscircles(centersStrong5, radiiStrong5,'EdgeColor','b');

Figure contains an axes object. The axes object contains 3 objects of type line, image.

イメージをワークスペースに読み取って表示します。

A = imread('circlesBrightDark.png');
imshow(A)

Figure contains an axes object. The axes object contains an object of type image.

半径の範囲を定義します。

Rmin = 30;
Rmax = 65;

半径の範囲内のイメージ内にある明るい円をすべて検索します。

[centersBright, radiiBright] = imfindcircles(A,[Rmin Rmax],'ObjectPolarity','bright');

半径の範囲内のイメージ内にある暗い円をすべて検索します。

[centersDark, radiiDark] = imfindcircles(A,[Rmin Rmax],'ObjectPolarity','dark');

明るい円のエッジに青い実線を描画します。

viscircles(centersBright, radiiBright,'Color','b');

Figure contains an axes object. The axes object contains 3 objects of type line, image.

暗い円のエッジに赤い破線を描画します。

viscircles(centersDark, radiiDark,'LineStyle','--');

Figure contains an axes object. The axes object contains 5 objects of type line, image.

入力引数

すべて折りたたむ

円形オブジェクトを検出する対象となる入力イメージ。グレースケール、トゥルーカラー (RGB)、またはバイナリ イメージとして指定します。

データ型: single | double | int16 | uint8 | uint16 | logical

円の半径、または検出する円形オブジェクトのおよその半径。正の数値として指定します。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

検出する円形オブジェクトの半径の範囲。[rmin rmax] 形式の正の整数の 2 要素ベクトルとして指定します。rminrmax 未満です。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

名前と値の引数

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。

例: centers = imfindcircles(A,radius,ObjectPolarity=bright) は暗い背景色に明るい円のオブジェクトを指定します。

R2021a より前では、コンマを使用して名前と値の各ペアを区切り、Name を引用符で囲みます。

例: centers = imfindcircles(A,radius,"ObjectPolarity","bright") は暗い背景色に明るい円のオブジェクトを指定します。

オブジェクトの極性。次の表のいずれかの値として指定します。

"bright"円オブジェクトが背景よりも明るいことを示します。
"dark"円オブジェクトが背景よりも暗いことを示します。

アキュムレータ配列を計算するために使用する計算法。次の表のいずれかの値として指定します。

"PhaseCode"Atherton および Kerbyson[1]の位相符号化メソッド。
"TwoStage"2 段階の円のハフ変換で使用されるメソッド[2][3]

例: "Method","PhaseCode" は Atherton および Kerbyson の位相符号化メソッドを指定します。

円のハフ変換アキュムレータ配列の感度係数。[0, 1] の範囲の数値として指定します。感度係数を大きくすると、imfindcircles は不完全で部分的に不明瞭な円も含めて、より多くの円形オブジェクトを検出します。また、感度を高い値に設定すると、誤検出のリスクが高くなります。

イメージ内のエッジ ピクセルを判別するためのエッジ勾配のしきい値。範囲 [0, 1] 内の数値として指定します。しきい値をゼロ勾配の大きさに設定するには 0 を指定します。最大勾配の大きさに設定するには 1 を指定します。しきい値を低い値に設定すると、imfindcircles は、弱いエッジと強いエッジの両方を含む、より多くの円形オブジェクトを検出します。しきい値を大きくするほど、弱いエッジをもつ円の検出が少なくなります。既定の設定では、imfindcircles は関数 graythresh を使用してエッジ勾配のしきい値を自動的に選択します。

例: "EdgeThreshold",0.5

出力引数

すべて折りたたむ

P 行 2 列の行列で返される円の中心の座標です。この行列の 1 列目には円の中心の x 座標が含まれ、2 列目には y 座標が含まれます。行数 P は検出された円の数です。centers は、円の強度が最も強いものから最も弱いものの順に並べ替えられます。

データ型: double

円の中心の推定半径です。列ベクトルで返されます。radii(j) の半径値は、中心が centers(j,:) にある円に対応します。

データ型: double

円の強度は、円の中心の相対的な強度を指定します。列ベクトルで返されます。metric(j) の値は、半径が radii(j) で中心が centers(j,:) にある円に対応します。

データ型: double

ヒント

  • radius (または rmin) の値が 5 以下の場合、imfindcircles の精度は制限されます。

  • 通常の場合、"TwoStage" ではなく "PhaseCode" メソッド (既定の設定) を使用すると、半径の推定ステップが高速になります。

  • "PhaseCode""TwoStage" の両方の計算メソッドが、同心円を検出する機能において制限されます。同心円の検出結果は、入力イメージによって異なる場合があります。

  • imfindcircles は中心がイメージの領域の外にある円を検索しません。

  • imfindcircles は、イメージを処理する前に、関数 rgb2gray を使用してトゥルーカラー イメージをグレースケールに変換します。バイナリ (logical) イメージおよび整数型イメージは、処理する前に、関数 im2single を使用してデータ型 single に変換されます。バイナリ イメージの結果の精度を高めるため、imfindcircles は、前処理手順として imfilter を使用してガウス平滑化も適用します。

アルゴリズム

imfindcircles は、円のハフ変換 (CHT) ベースのアルゴリズムを使用してイメージ内の円を検出します。この手法が使用されるのは、ノイズ、オクルージョン、および照度の変化に対してロバスト性があるためです。

CHT は厳密に規定されているアルゴリズムではなく、さまざまな方法で実装することができます。ただし、すべての手法に共通する 3 つの重要な手順があります。

  1. アキュムレータ配列の計算

    高い勾配値の前景ピクセルは候補ピクセルとして指定され、アキュムレータ配列に "投票" できるようになります。従来の CHT 実装において、候補ピクセルは、周囲に一定半径の完全な円を形成するパターンに投票します。図 1a は、実際の円 (実線の円) 上にある候補ピクセルと、候補ピクセルの従来の CHT 投票パターン (破線の円) の例を示しています。

    従来の CHT 投票パターン

    Accumulator array voting patterns for candidate points lying on the edge of a circle

  2. 中心の推定

    イメージの円に属する候補ピクセルの票は、円の中心に対応するアキュムレータ配列のビンに蓄積されます。したがって、円の中心は、アキュムレータ配列内のピークを検出することで推定されます。図 1b は、実際の円 (実線の円) 上にある候補ピクセル (実線の点) と、実際の円の中心と一致する投票パターン (点線の円) の例を示しています。

  3. 半径の推定

    CHT アルゴリズムで一般に行われるように、複数の半径の値に同じアキュムレータ配列を使用する場合、検出された円の半径は別の手順で推定する必要があります。

imfindcircles には、イメージ内の円を検出するために位相符号化 (既定の設定) および 2 段階という 2 つのアルゴリズムが備わっています。この 2 つのアルゴリズムは共通の計算手順をいくつか使いますが、また、それぞれに固有の特徴をもちます。

この 2 つのアルゴリズムで使用される共通の計算機能は以下のとおりです。

  • 2 次元アキュムレータ配列の使用

    従来のハフ変換では、複数の半径の投票を格納するために 3 次元配列を必要とします。これにより、大きなストレージが必要になり、処理時間が長くなります。位相符号化メソッドと 2 段階メソッドは、すべての半径に対して 2 次元アキュムレータ配列を 1 つ使用することによりこの問題を解決しています。この手法では半径の推定という追加ステップが必要になりますが、広い半径範囲を扱うときは特に、全体的な計算負荷は通常低くなります。これは、最近の CHT 実装で広く採用されている手法です。

  • エッジ ピクセルの使用

    全体のメモリ要件と速度は、候補ピクセルの数に大きく依存します。その数を制限するため、高い勾配のピクセルのみが票の集計に含まれるように、入力イメージの勾配の大きさがしきい値になっています。

  • エッジ方向の情報の使用

    パフォーマンスは、候補ピクセルに対して利用可能なビンの数を制限することでも最適化されます。これを行うには、ローカルで利用可能なエッジ情報を使用して、勾配の方向に沿って限られた間隔のみで投票を許可します (図 2)。投票間隔の幅 (図中の点 cmin と cmax の間) は、rmin と rmax で定義される半径の範囲によって決まります。

    投票モード: 勾配方向の複数の半径

    Graphical representation of the permitted voting interval for a candidate pixel. The direction of the voting interval is perpendicular to the edge of the circle at the candidate point.

rmin最小探索半径
rmax最大探索半径
ractual候補ピクセルが属する円の半径
cmin半径 rmin の円の中心
cmax半径 rmax の円の中心
cactual半径 ractual の円の中心

関数 imfindcircles で用いられている 2 つの CHT メソッドでは、円の半径を計算する方法が基本的に異なります。

  • 2 段階

    半径は、推定された円の中心とイメージ情報を使用して明示的に推定されます。この手法は、半径ヒストグラムの計算に基づいています [2] [3]

  • 位相符号化

    半径は、アキュムレータ配列内の複素数値と、配列エントリの位相で符号化された半径情報から推定されます[1]。エッジ ピクセルによって投じられた票には、考えられる中心の位置だけでなく、中心位置に関連付けられた円の半径についての情報も含まれます。放射状ヒストグラムを使用して明示的に半径を推定しなければならない 2 段階メソッドとは異なり、位相符号化では、アキュムレータ配列内にある推定された中心位置の位相情報をデコードするだけで半径を推定できます。

参照

[1] T.J Atherton, D.J. Kerbyson. "Size invariant circle detection." Image and Vision Computing. Volume 17, Number 11, 1999, pp. 795-803.

[2] H.K Yuen, .J. Princen, J. Illingworth, and J. Kittler. "Comparative study of Hough transform methods for circle finding." Image and Vision Computing. Volume 8, Number 1, 1990, pp. 71–77.

[3] E.R. Davies, Machine Vision: Theory, Algorithms, Practicalities. Chapter 10. 3rd Edition. Morgan Kauffman Publishers, 2005.

拡張機能

バージョン履歴

R2012a で導入

すべて展開する