ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

imfindcircles

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

構文

centers = imfindcircles(A,radius)
[centers,radii] = imfindcircles(A,radiusRange)
[centers,radii,metric] = imfindcircles(A,radiusRange)
[centers,radii,metric] = imfindcircles(___,Name,Value)

説明

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 の行に対応します。

[centers,radii,metric] = imfindcircles(___,Name,Value) は、前のいずれかの構文を用いて、1 つ以上の Name,Value の引数のペアをもつ追加オプションを指定します。

すべて折りたたむ

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

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

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

半径 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');

この例では、イメージ内の明るい円と暗い円の円周に線を描画する方法を説明します。

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

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

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

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');

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

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

入力引数

すべて折りたたむ

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

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

円の半径は、検出する円形オブジェクトのおよその半径であり、任意の数値型のスカラーとして指定します。

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

検出する円形オブジェクトの半径の範囲です。任意の数値型の整数値をもつ 2 要素ベクトル [rmin rmax] として指定します。

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

名前/値のペアの引数

オプションの Name,Value 引数のペアをコンマ区切りで指定します。ここで、Name は引数名で、Value は対応する値です。Name は単一引用符 (' ') で囲まなければなりません。Name1,Value1,...,NameN,ValueN のように、複数の名前と値のペアの引数を任意の順番で指定できます。

例: 'ObjectPolarity','bright' は暗い背景色に明るい円のオブジェクトを指定します。

すべて折りたたむ

オブジェクトの極性は、円形オブジェクトが背景よりも明るいか暗いかを示します。'ObjectPolarity' と次の表のいずれかの値で構成されるコンマ区切りのペアとして指定します。

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

計算メソッドはアキュムレータ配列を計算するために使用する手法です。'Method' と次の表のいずれかの値で構成されるコンマ区切りのペアとして指定します。

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

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

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

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

例: 'EdgeThreshold',0.5 は、エッジ勾配のしきい値を 0.5 に設定します。

出力引数

すべて折りたたむ

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

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

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

ヒント

  • 精度を高めるには、radiusRange に小さい値を指定します。一般的には、rmax < 3*rmin および (rmax-rmin) < 100 の条件を満たす radiusRange の値を選択します。

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

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

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

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

  • imfindcircles は、結果の精度を高めるためにバイナリ (論理) イメージの前処理を行います。イメージを処理する前に、関数 rgb2gray を使用してトゥルーカラー イメージをグレースケールに変換します。

アルゴリズム

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

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

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

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

    図 1: 従来の CHT 投票パターン

  2. 中心の推定

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

  3. 半径の推定

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

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

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

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

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

  • エッジ ピクセルの使用

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

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

    パフォーマンスを最適化するためのもう 1 つの方法は、候補ピクセルに対して利用可能なビンの数を制限することです。これを行うには、ローカルで利用可能なエッジ情報を使用して、勾配の方向に沿って限られた間隔のみで投票を許可します (図 2)。

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

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

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

  • 2 段階

    半径は、推定された円の中心とイメージ情報を使用して明示的に推定されます。この手法は、半径ヒストグラムの計算に基づいています。詳しい説明は、参考文献 1 と 2 を参照してください。

  • 位相符号化

    位相符号化 (参考文献 [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 で導入

この情報は役に立ちましたか?