2017-06-23 83 views
2

我想了解如何imfindcircles的作品,所以我創建了一個簡單的圖像黑色背景和一個白色圓圈。該圖像是640×480和圓的直徑爲122個像素:Matlab:無法找到一個圈imphindcircles

enter image description here

我試圖用imfindcircles來檢測圓,我試圖圖像的各種模式,如uint8 RGB,uint8灰度,double灰度和反轉圖像,以所有這些形式,以及minRmaxR的各種值。我沒有結果在所有情況下:

minR = 40; 
maxR = 80; 
Irgb = imread('example_circle.png'); 
Irgbr = 255 - Irgb; 
I = rgb2gray(Irgb); 
Ir = 255 - I; 
Id = double(I)/255; 
Ird = 1 - Id; 

[c1,r1] = imfindcircles(I,[minR maxR]); 
[c2,r2] = imfindcircles(Ir,[minR maxR]); 
[c3,r3] = imfindcircles(Id,[minR maxR]); 
[c4,r4] = imfindcircles(Ird,[minR maxR]); 
[c5,r5] = imfindcircles(Irgb,[minR maxR]); 
[c6,r6] = imfindcircles(Irgbr,[minR maxR]); 

disp([length(r1) length(r2) length(r3) length(r4) length(r5) length(r6)]); 

輸出是:

0  0  0  0  0  0 

我怎麼使用函數來查找圈?

+0

二進制輸入通常會給出最好的結果,但基於文檔它也應該適用於灰度和RGB圖像。使用二進制圖像:'[c1,r1] = imfindcircles(I> 128,[minR maxR]);' – m7913d

+0

您可能會在[以前的文章]中找到更多信息(https://stackoverflow.com/search?q=%5Bmatlab %5D + imfindcircles) – m7913d

+0

@ m7913d,它適用於二進制圖像,但不適用於反轉二進制圖像(黑色圓圈,白色背景),但我無法使用二進制圖像,我需要在另一個程序中使用該函數具有更復雜的圖像。 – SIMEL

回答

2

imfindcircles函數具有'Sensitivity'參數:

當增加的靈敏度因子,imfindcircles檢測多個圓形物體,包括虛弱,部分模糊圓圈。較高的靈敏度值也增加了錯誤檢測的風險。

通過將靈敏度設置爲更高的值,可以獲得更多潛在的圓圈。您可以調整此參數以始終爲您提供一個圓圈,例如0.95似乎在這個特定情況下工作正常。雖然這可能不是很強大。

[c1, r1] = imfindcircles(Irgb,[40,80], 'Sensitivity', 0.95) 

如果你知道總會有正好一個圈,你可以設置靈敏度,以1,它返回所有潛在的圈子。然後,使用metric輸出,該輸出爲您提供了檢測到的圓的計算強度。如你所知,只會有一個圓圈,你可以選擇最強的一個圓圈,它總是第一行。

[c, r] = imfindcircles(Irgb,[40,80], 'Sensitivity', 1); 
c1 = c(1,:); 
r1 = r(1,:); 
+0

我想知道爲什麼你刪除了你的帖子。感謝您取消刪除。 +1。 – rayryeng

+0

@rayryeng謝謝。正如你從編輯歷史中看到的,我基本上創造了一個新的答案。下載示例圖像時我犯了一個錯誤:看起來預覽圖像的分辨率比實際圖像小,所以半徑是正確的,這與我在答案的第一個版本中寫的不同。 – hbaderts

+0

我明白了!但是,是的,這是正確的答案。預期的半徑參數未被正確使用,並且您還提到了「靈敏度」參數。 – rayryeng