MATLAB में छवि के अंदर एक गोलाकार आकार का पता लगाएं

एक छवि में इन परिपत्र आकार का पता लगाने का सबसे तेज़ तरीका क्या है?

Red Circle to be detected

त्रिज्या हमेशा (80-100 मिमी) के बीच होता है। पृष्ठभूमि हमेशा सफेद है। और सर्कल हमेशा केंद्र में रहेगा।

I have tried Hough Transform but I couldn't really get it to work. I am new to this, and I get a feeling like Hough Transform is a overkill for this. Kindly suggest me the right approach to do this. enter image description here


अद्यतन करें

आटा परिवर्तन लागू करने के बाद मुझे यह मिला है।

मैंने एल्गोरिदम का उल्लेख किया है यहां

बड़े एल्गोरिदम से प्रासंगिक कोड निम्नलिखित है

% applying Hough Below
[accum, circen, cirrad] = ...
    CircularHough_Grd(gR, [89 93],...
    17.4, 13, 1);   % this executes in 0.72 sec

% Lets see what we got
imshow(gR);
hold on;
plot(circen(:,1), circen(:,2), 'r+');
for ii = 1 : size(circen, 1)
    rectangle('Position',[circen(ii,1) - cirrad(ii), circen(ii,2) - cirrad(ii), 2*cirrad(ii), 2*cirrad(ii)],...
        'Curvature', [1,1], 'edgecolor', 'b', 'linewidth', 1.5);
end
hold off;

enter image description here

सार्थक सर्कल बीच में एक है।

0
क्या आप पहले अपने प्रयासों को दिखा सकते हैं?
जोड़ा लेखक Eitan T, स्रोत

2 उत्तर

यहां मैं प्रस्तावित करता हूं:
 1. "सफेद से अंतर" को बढ़ाने, ग्रे छवि में कनवर्ट करें

gimg = min( img, [], 3 );

enter image description here
2. Threshold to remove white area

BW = im2bw( gimg, .4 ); 

enter image description here
3. Get area and centroid porperties of image regions

st = regionprops( ~BW, 'Area', 'Centroid', 'PixelIdxList' );

4. केवल बड़े पर्याप्त क्षेत्रों का चयन करें

sel = [st.Area] > numel(BW)*0.025; % at least 2.5% of image size
st = st(sel);

5. छवि के केंद्र के लिए क्षेत्र दूरी की गणना करें

cntr = .5 * [size(BW,2) size(BW,1)]; % X-Y coordinates and NOT Row/Col
d = sqrt( sum( bsxfun(@minus,vertcat( st.Centroid ), cntr ).^2, 2 ) );

6. केंद्र के निकटतम क्षेत्र चुनें

[mn idx] = min(d);

7. एक मुखौटा बनाएँ

res = false(size(BW)); 
res( st(idx).PixelIdxList ) = true;

enter image description here

सर्कुलर वाले क्षेत्रों को बेहतर तरीके से अस्वीकार करने के लिए आप अन्य क्षेत्र गुणों (उदा।, 'सनकी' ) का उपयोग करने पर भी विचार कर सकते हैं।

0
जोड़ा
@Shai यह एक $ निपर शॉट है। सर्कल का पता नहीं होगा कि हिट'म क्या है। यह केवल 0.04sec लेता है (आटा परिवर्तन की तुलना में बहुत कम है जो मैं कर रहा था)! अगले चरण के रूप में मैं सफेद अपूर्ण सर्कल को एक वर्ग के अंदर घेरूंगा और उसका केंद्र प्राप्त करूँगा और एक बेहतर सर्कल अनुमानित करूँगा और उसके बाद उस सर्कल को मास्क के रूप में उपयोग करें और फिर सर्कल का रंग प्राप्त करने का प्रयास करें। क्या यह दृष्टिकोण सही है? या ऐसा करने के लिए एक तैयार_मेड विधि है?
जोड़ा लेखक vvy, स्रोत
@Shai reshape (img, [], 3) फेंकता है ज्ञात आयामों का उत्पाद, 3, तत्वों की कुल संख्या में विभाजित नहीं, 450800। त्रुटि। मुझे लगता है कि इसे आकार में विभाजित करने के लिए img सरणी को छोटा या छोटा करने की आवश्यकता होगी।
जोड़ा लेखक vvy, स्रोत
@Shai मैंने myImg = getnapshot (videoinput_obj_640_480) स्नैप 640x480x3 uint8 सरणी के माध्यम से स्नैप प्राप्त किए। और मैंने imshow (myImg) फिर इन छवियों को jpg प्रारूप में सहेज लिया है और किसी भी तरह वे 566x805x3 uint8 सरणी बन गए हैं ।
जोड़ा लेखक vvy, स्रोत
जोड़ा लेखक vvy, स्रोत
@ वाई - regionprops पर एक नज़र डालें और यह आपको क्या पेशकश कर सकता है। मेरे कोड में आपके पास पहले से 'Centroid' फ़ील्ड st struct array में मंडली का केंद्र है। आपको जिस सटीकता की आवश्यकता है उसके आधार पर आपको सर्कल के त्रिज्या का अनुमान लगाने के लिए एक विधि खोजनी होगी। यदि यह रंग आप चाहते हैं - तो आपको किसी सर्कल का अनुमान लगाने की आवश्यकता नहीं है - मास्क res आपको बस चाहिए: t = reshape (img, [], 3); सी = माध्य (टी (res, :), 1) आपको मास्क किए गए पिक्सल का औसत रंग देगा।
जोड़ा लेखक Shai, स्रोत
@ अगर आपके रंग छवि के तत्वों की संख्या 3 से विभाजित नहीं है तो यह विचित्र है: आपके पास प्रत्येक पिक्सेल के आर, जी और बी घटकों के अनुरूप आकार 3 का तीसरा आयाम होना चाहिए।
जोड़ा लेखक Shai, स्रोत
@wy जब तक वे अंत में x3 प्राप्त करते हैं: t = reshape (myImg, [], 3); सी = माध्य (टी (res, :), 1) आपको सर्कल के औसत आरजीबी मान देना चाहिए।
जोड़ा लेखक Shai, स्रोत
यह सुनिश्चित करने के लिए कि आपको एक सर्कल मिल रहा है, आप यह देखने के लिए जांच सकते हैं कि इसके क्षेत्र का अनुपात अधिकतम त्रिज्या है।
जोड़ा लेखक Neil Forrester, स्रोत

यदि आपका matlab संस्करण R2012a है या बाद में, छवि प्रसंस्करण टूल बॉक्स में imfindcircles फ़ंक्शन शामिल है जिसका उपयोग छवि में मंडलियों का पता लगाने के लिए किया जाता है।

filen='http://i.stack.imgur.com/pmBp1.jpg';  % your original image
I=imread(filen);

I=im2bw(I(:,:,3));  % convert to gray scale
Rmin=50;Rmax=100;  % circle radius range
[centersDark, radiiDark] = imfindcircles(I, [Rmin Rmax], ...
                                        'ObjectPolarity','dark','sensitivity',0.93)
imagesc(I),hold on
viscircles(centersDark, radiiDark,'LineStyle','--');hold off

The result: enter image description here

दरअसल यह समारोह भी हफ़ ट्रांसफॉर्म पर लागू होता है, मुझे लगता है कि यह आपके जैसा ही है। आपको एक बात ध्यान देने की आवश्यकता हो सकती है, हौ में संवेदनशीलता के अनुरूप दहलीज का पता लगाने के परिणाम पर बहुत अधिक प्रभाव पड़ता है। बहुत अधिक संवेदनशीलता कमजोर या आंशिक रूप से अस्पष्ट लोगों सहित अधिक मंडलियों का पता लगाने की ओर ले जाती है, जो कि उच्च झूठी पहचान दर के जोखिम पर होती है, जो आपको प्राप्त हुई थी।

0
जोड़ा
@ lennon310 मेरे पास R2010a है। क्या मैं अपनी रिलीज के लिए imfindcircles प्राप्त कर सकता हूं? सर्कल पाने के लिए इस स्क्रिप्ट को कितना समय लगता है?
जोड़ा लेखक vvy, स्रोत
यह काफी अधिक है। वाई के टिप्पणी देखें चलने का समय
जोड़ा लेखक Shai, स्रोत
इसे तब इमेजिंग प्रसंस्करण टूलबॉक्स में शामिल किया जाना चाहिए। Ifindcircles को लागू करने के लिए ~ 0.7s लेता है, जबकि क्षेत्रप्रॉप के लिए ~ 0.05s। तो यदि आपके पास संसाधित होने वाली बड़ी मात्रा में छवि है, तो गति बहुत धीमी हो सकती है।
जोड़ा लेखक lennon310, स्रोत