このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。
この例では,イメージ内の円または円形オブジェクトを自動的に検出し,検出された円を可視化する方法を説明します。
さまざまな色の円形プラスチックチップのイメージを読み取って表示します。検出対象となるたくさんの円があるだけでなく,円を検出するという観点でこのイメージを捉えると,いくつかの興味深い点が見えてきます。
さまざまさまざまな色のチップがありもは背景いいいてていはこの背景ののチップははこののコントラストがはっきりはっきりとコントラストコントラストコントラストがはっきりとはっきりコントラストコントラストいはっきりはっきりててていががてていががててていいいががてていいいてていいいいてていてててていいい异なっ异なってていい异なってていもも异なっ异なっていますあり异なっ异なっありありあり异なっありありありありあり异なっありありありありあり异なってていいい异なっていいははこのののコントラストチップははがコントラストがががががはっきりはっきりはっきりはっきりはっきりはっきりはっきりはっきりはっきりががコントラストがはっきりはっきりはっきりますますますますますががコントラストがますますますますますますますますますますますますますます必あいまいです。
。
rgb = imread (“coloredChips.png”);imshow (rgb)
関数draw
を使用して,円の適切な半径の範囲を検索します。チップのおおよその直径の上に線を描画します。
d =画直线;
ラインROIの長さはチップの直径です。通常のチップの直径は40 ~ 50ピクセルの範囲にあります。
pos = d.Position;diffPos = diff (pos);diffPos直径=函数(diffPos (1), (2))
直径= 45.3448
関数imfindcircles
により,ある半径の範囲を持つ円を検索します。20 ~ 25ピクセルの範囲の半径を持つ円を検索します。その前に,背景と比較してオブジェクトが明るいか暗いかを確認しておきます。これを確認するために,このイメージのグレースケールバージョンを見てみましょう。
gray_image = rgb2gray (rgb);imshow (gray_image)
背景がかなり明るく,ほとんどのチップが背景より暗いことがわかります。しかし,既定では,imfindcircles
この背景より明显円形オブジェクトを検出します。このこの,imfindcircles
でパラメーター‘ObjectPolarityを‘黑暗’に設定して,暗い円を探索します。
[中心,半径]= imfindcircles(rgb,[20 25],“ObjectPolarity”,'黑暗的')
[]半径= []
出力中心
とradii.
が空になっていますが,これは円が検出されなかったことを表しています。このような結果になることはよくあります。これは,imfindcircles
が円の"検出器"であり,多くの検出器と同じように,imfindcircles
には感度を決定する内部の“検出しきい値”つまり,検出器材の(円の)検出が"有効"であると見なされるには,その検出に対する信頼度が一定のレベルを超えていなければなりません。imfindcircles
にはパラメーター'敏感性'があり,これを使使て,このこの内部しきい値,结果内部得られるの感度制御できますれるの感度制御できます。敏感的'を高度値にすると検出しきい値が低く低くなりと検出しきい値低く低く検出される円がなりなり。これこれ,ホームセキュリティシステムで使さモーションでの感度制御似似似てていいいいい
チップのイメージに戻ります。既定の感度レベルではすべての円が内部しきい値より低く,そのために円が検出されなかった可能性があります。灵敏度'は0から1までの数値で,既定では0.85に設定されています。灵敏度を0.9に上げます。
[中心,半径]= imfindcircles(rgb,[20 25],“ObjectPolarity”,'黑暗的',...'灵敏度', 0.9)
中心=8×2146.1895 198.5824 328.8132 135.5883 130.3134 43.8039 175.2698 297.0583 312.2831 192.3709 327.1316 297.0077 243.9893 166.4538 271.5873 280.8920
半径=8×123.1604 22.5710 22.9576 23.7356 22.9551 22.9995 22.9055 23.0298
今回は,imfindcircles
が円をいくつか検出しました。正確には8つです。中心
には円の中心の场所が格式されおりおりradii.
にはこれらの円の推定半径が格納されています。
関数viscircles
をを用するする,イメージ上に円を描画できます。imfindcircles
からの出力変数中心
とradii.
は,viscircles
に直接渡すことが可です。
Imshow (rgb) h = viscircles(圆心,半径);
円の中心は正しく配置されており,対応する半径も実際のチップとうまく一致しているようです。しかし,まだ検出されていないチップがかなりあります。灵敏度的をもう少し高い0.92に上げてみましょう。
[中心,半径]= imfindcircles(rgb,[20 25],“ObjectPolarity”,'黑暗的',...'灵敏度', 0.92);长度(中心)
ans = 16.
“敏感性”を上げたら,円の数も増えました。これらの円をイメージ上にもう一度プロットします。
删除(h)%删除先前绘制的圆圈H = Viscircles(中心,半径);
,よこの方法の方がい結果になります。imfindcircles
には円を検出するための方法が2つあります。ここまでは,円を検出するために"位相符号化"メソッドという既定のメソッドを使ししきました。imfindcircles
には,一般に“2¼”メソッドと呼ばれいる1つのメソッドがあります.2段阶メソッドを使ますしし结果结果を表示ます。
[中心,半径]= imfindcircles(rgb,[20 25],“ObjectPolarity”,'黑暗的',...'灵敏度', 0.92,“方法”,'扭曲');Delete (h) h = viscircles(圆心,半径);
0.92の敏感性で2段階メソッドのほうが多くの円を検出しています。概略を述べると,これらの2つのメソッドは異なる長所をもっていて,補完しあっています。通常,位相符号化メソッドは2段階メソッドよりも速く,ノイズに対するロバスト性がわずかに優れています。しかし2段階メソッドと同じ数を検出するには,“灵敏度”レベルを高くしなければなりません。たとえば,位相符号化メソッドで“灵敏度”レベルを0.95に上げると,同じ数のチップが検出されます。
[中心,半径]= imfindcircles(rgb,[20 25],“ObjectPolarity”,'黑暗的',...'灵敏度', 0.95);删除(h) viscircles(中心、半径);
imfindcircles
の両方のメソッドが,一部だけ見えている(隠れている)チップの中心と半径を正確に検出することに注意してください。
最后最后の结果をを见てみる,面白いことに,imfindcircles
はイメージ内の黄色のチップを検出していません。黄色のチップは,背景とのコントラストが强くありません。それどころか,背景とかなり近い强度をもっているようです。黄色のチップは,想定していたほど背景より“暗く”ないということでしょうか。これこれを确认するため,このイメージのグレースケールバージョンをもう表示します。
imshow (gray_image)
黄色のチップは,背景と比較すると,ほとんど同じ強度です。背景より明るいかもしれません。そこで,黄色のチップを検出するために,‘ObjectPolarityを“明亮”に変更します。
[centersBright,radiiBright] = imfindcircles(rgb,[20 25],...“ObjectPolarity”,'明亮的','灵敏度', 0.92);
viscircles
の'颜色'パラメーターを変更し,异なる色で“明るい”円を描画します。
imshow(rgb) hBright = viscircles(centersBright, radiiBright,'颜色',“b”);
検出されていなかった黄色のチップが3つ検出されましたが,黄色のチップがまつだ1抜け落ちています。これらの黄色のチップは,この背景では他のチップのように”際立って”いないため,検出が困难です。
imfindcircles
には‘EdgeThresholdという別のパラメーターがあり,ここで役に立ちます。円を検出するために,imfindcircles
はイメージ内のエッジピクセルのみを使用します。これらのエッジピクセルは,基本的には高い勾配値をもつピクセルです。EdgeThreshold”パラメーターは,あるピクセルがエッジピクセルであると見なされ計算に組み込まれるには,そのピクセルでの勾配値がどの程度“高く”なければならないかを制御します。このパラメーターに高い(1に近い)値を指定すると,强いエッジ(高い勾配値)のみが计算にれ,低い(0に近い)値値をすると,许容许容が広くなり,弱いエッジ(低い勾配値)も検出れ组み込まれますチップ検出れ黄色のチップののは,コントラストが低いため,チップ外周の境界の,チップ低い勾配をもつこと低い勾配ます。したがっしたがっ,'edgethreshold'パラメーターの値を下载て,黄色のチップのののエッジが计算に组み込まれるようにししししししししししししししますますますますます。
[centersBright,radiiBright,metricBright] = imfindcircles(rgb,[20 25],...“ObjectPolarity”,'明亮的','灵敏度', 0.92,“EdgeThreshold”, 0.1);delete(hBright) hBright = viscircles(centersBright, radiiBright,'颜色',“b”);
これで,imfindcircles
はすべての黄色のチップと1つの绿のチップを検出しました。これらのチップを青で, 'ObjectPolarity' を '黑暗' にして先に検出していた他のチップを赤で描画します。
H = Viscircles(中心,半径);
すべての円が検出されています。最後に,注意の必要な点があります。パラメーターを検出率が高くなるような値に変更すると,検出される円は増えますが,円を誤って検出する可能性も高くなります。正しく検出できる円の数(検出率)と誤って検出される円の数(誤認率)の間にはトレードオフがあります。
円探しをお楽しみください!