शोर छवि डेटा में एक सर्कल का पता लगाने


17

मेरी एक छवि है जो नीचे दी गई है: यहाँ छवि विवरण दर्ज करें

मैं सर्कल के त्रिज्या (या व्यास) को खोजने की कोशिश कर रहा हूं। मैंने परिपत्र हूप ट्रांसफॉर्मेशन (मैटलैब के माध्यम से imfindcircles(bw,[rmin rmax],'ObjectPolarity','bright')), और एक सर्कल या एक दीर्घवृत्त (घर का बना फ़ंक्शन जो कम शोर डेटा के लिए बहुत अच्छी तरह से काम करता है, नीचे देख कर) का उपयोग करके कोशिश की है।

मैंने एक स्पष्ट सर्कल प्राप्त करने के लिए कुछ इमेज प्रोसेसिंग की भी कोशिश की है, उदाहरण के लिए, नीचे देखें:

se = strel('disk', 2);
bw = imdilate(bw, se);
bw = bwareaopen(bw,100000); 
bw =  edge(bw); 

यहाँ छवि विवरण दर्ज करें

हालाँकि, जब मैं प्रोसेस्ड इमेज को या तो तकनीकों (Hough and Circle \ ellipse फिटिंग) को फीड करता हूं, तो दोनों में से किसी को भी एक अच्छे तरीके से सर्कल का पता लगाने का प्रबंधन नहीं करते हैं।

यहाँ पर मैंने (matlab) [पंक्ति कर्नल] = find (bw) सर्कल सर्कल खोजक का एक कोड स्निपेट लिखा है; contour = bwtraceboundary (bw, row (1), col (1)], 'N', कनेक्टिविटी, num_point);

    x = contour(:,2);
    y = contour(:,1);

    % solve for parameters a, b, and c in the least-squares sense by
    % using the backslash operator
    abc = [x y ones(length(x),1)] \ -(x.^2+y.^2);
    a = abc(1); b = abc(2); c = abc(3);

    % calculate the location of the center and the radius
    xc = -a/2;
    yc = -b/2;
    radius  =  sqrt((xc^2+yc^2)-c);

वैकल्पिक दृष्टिकोण की सराहना की जाएगी ...


पर्याप्त परिवर्तन एक सर्कल के लिए दिखता है, एक भरी हुई डिस्क नहीं। भरे हुए डिस्क को खाली सर्कल में बदलने के लिए आपको पहले एज डिटेक्शन करने की आवश्यकता होगी। आपके मंडलियों के गुण क्या हैं? आकार स्थिर है? क्या वे अंडाकार हो सकते हैं? क्या डॉट्स को अलग-अलग वितरित किया जा सकता है?
एंडोलिथ

मैंने कोशिश की (संपादित उदाहरण देखें), यह या तो बहुत शोर है या, पर्याप्त रूप से परिपत्र नहीं है? इसके अतिरिक्त, आकार स्थिर है, और इसमें कैमरा एंगल त्रुटि के कारण मिनट की अण्डाकारता हो सकती है (हालांकि वास्तव में यह एक पूरी तरह से गोलाकार खिड़की है)।
bla

यदि आकार और आकार स्थिर है, तो आप मूल डिस्क छवि के साथ भरे डिस्क टेम्पलेट के क्रॉस-सहसंबंध जैसा कुछ आज़मा सकते हैं
एंडोलिथ

मेरे उत्तर के अलावा, मुझे लगता है कि आप अपनी छवि प्रसंस्करण पाइप के बाद के चरण में भी ऐसा करने की कोशिश कर रहे होंगे। क्या आप हमें समस्या के बारे में अधिक बता सकते हैं, और कुछ पूर्व कदम बता सकते हैं?
एंड्रे रुबेश्टिन

जवाबों:


13

यहाँ मेरा समाधान है, यह @ योदा के विचार के करीब है, लेकिन मैंने कुछ कदम बदल दिए।

  • सभी पिक्सेल को ऐसे चिह्नित करें कि उनके 7x7 पड़ोस में कम से कम 6 पिक्सेल हों
  • सभी ब्लब्स निकालें, लेकिन सबसे बड़ा
  • छिद्रों को भरें
  • एज डिटेक्शन लागू करें
  • पर्याप्त परिवर्तन का उपयोग कर सर्कल का पता लगाएं

यहाँ छवि विवरण दर्ज करें यहाँ छवि विवरण दर्ज करें यहाँ छवि विवरण दर्ज करें यहाँ छवि विवरण दर्ज करें यहाँ छवि विवरण दर्ज करें

यहाँ प्रासंगिक Matlab कोड है। मैं अपने कोड में हलकों में .m फ़ाइल के लिए पर्याप्त परिवर्तन का उपयोग कर रहा हूं।

function FindCircle()
    close all;
    im = imread('C:\circle.png');
    im = im(:,:,2);

    ims = conv2(double(im), ones(7,7),'same');
    imbw = ims>6;
    figure;imshow(imbw);title('All pixels that there are at least 6 white pixels in their hood');

    props = regionprops(imbw,'Area','PixelIdxList','MajorAxisLength','MinorAxisLength');
    [~,indexOfMax] = max([props.Area]);
    approximateRadius =  props(indexOfMax).MajorAxisLength/2;

    largestBlobIndexes  = props(indexOfMax).PixelIdxList;
    bw = false(size(im));
    bw(largestBlobIndexes) = 1;
    bw = imfill(bw,'holes');
    figure;imshow(bw);title('Leaving only largest blob and filling holes');
    figure;imshow(edge(bw));title('Edge detection');

    radiuses = round ( (approximateRadius-5):0.5:(approximateRadius+5) );
    h = circle_hough(edge(bw), radiuses,'same');
    [~,maxIndex] = max(h(:));
    [i,j,k] = ind2sub(size(h), maxIndex);
    radius = radiuses(k);
    center.x = j;
    center.y = i;

    figure;imshow(edge(bw));imellipse(gca,[center.x-radius  center.y-radius 2*radius 2*radius]);
    title('Final solution (Shown on edge image)');

    figure;imshow(im);imellipse(gca,[center.x-radius  center.y-radius 2*radius 2*radius]);
    title('Final solution (Shown on initial image)');

end

1
यहाँ क्या परिवर्तन कर रहा है जो इसे हल करता है और नीले वृत्त को खोजता है? क्या यह छवि पर अलग-अलग पदों पर विभिन्न राडियों के कई हलकों को पेश कर रहा है और सबसे अच्छा फिट बैठता है?
स्पेसी

@ मोहम्मद, यह सामान्य सर्कल डिटेक्टर है। इसमें बिनिंग और वोटिंग का उपयोग किया जाता है।
एंड्रे रूबेशिन

आप इस उत्तर में पहले चरण के बाद फास्ट रेडियल सिमिट्री ट्रांसफॉर्म (FRST) का भी उपयोग कर सकते हैं।
Geniedesalpages

10

छवि प्रसंस्करण का उपयोग करके इसे करना काफी सरल है। निम्नलिखित गणित में अवधारणा का प्रमाण है । आपको इसे MATLAB में अनुवाद करना होगा।

  • सबसे पहले, कुल्हाड़ियों को ट्रिम करें और केवल छवि का हिस्सा रखें। मैं इसे चर कहता हूं img
  • छवि को बायनेरिज़ करें और इसे पतला करें, इसके बाद एक भरने वाला रूपांतरण। मैं आवारा छोटे घटकों को भी हटाता हूं जो मुख्य बूँद से जुड़े नहीं हैं। यह आपको निम्नलिखित की तरह कुछ देना चाहिए:

    filled = Binarize@img ~Dilation~ 3 // FillingTransform // DeleteSmallComponents
    

  • इसके बाद, इस बूँद के केन्द्रक और बूँद के समरूप डिस्क त्रिज्या को खोलें (OpenCV, MATLAB सभी के पास ऐसा करने के लिए समतुल्य आदेश हैं)

    {center, radius} = 1 /. ComponentMeasurements[filled, {"Centroid", "EquivalentDiskRadius"}]
    
  • बस! अब मूल छवि और उपरोक्त केंद्र और त्रिज्या के साथ एक वृत्त को देखें कि यह कैसे फिट बैठता है:

    Show[img, Graphics[{Red, Circle[center, radius]}]]
    


बहुत बढ़िया जवाब! आप फैलाव और भरने के परिवर्तन पर विस्तार कर सकते हैं?
स्पेसी

@Mohammad फैलाव एक बुनियादी आपरेशन है और आसानी से विकी लेख के द्वारा समझाया जा जाएगा। "छेद" या दूसरे शब्दों में भरने वाले भरने से, पिक्सेल के सेट जो उच्च मूल्य के पिक्सेल से घिरे होते हैं। "अधिक जानकारी" अनुभाग देखें यहाँ
Lorem Ipsum

अरी सॉरी, मैंने गलत टाइप किया। मैं प्रसार परिवर्तन से कुछ हद तक परिचित हूं, मैं वास्तव में सोच रहा था कि क्या आप 'भरने वाले परिवर्तन' पर विस्तार कर सकते हैं। यह किस नियम का उपयोग कर रहा है? मुझे उससे संबंधित जानकारी नहीं मिल रही है। शायद यह दूसरे नाम से जाता है?
स्पेसी

@yoda, उत्तर के लिए धन्यवाद, लेकिन यदि आप प्रश्न को पढ़ते हैं, तो आपने ध्यान दिया होगा कि मैंने फैलाव और फिटिंग की कोशिश की है। किनारों का पता लगाने से पहले निर्मित छवि आपकी समान है। मैं कुछ फिट हूं, यह सही नहीं है। वही आपके फिट के लिए है, आप देख सकते हैं कि फिट सर्कल का शीर्ष भाग बहुत बड़ा है, शायद इसलिए क्योंकि आप सर्कल के ऊपर शीर्ष भाग पर शोर बिंदु को ध्यान में रखते हैं। मैंने एक दीर्घवृत्त (जैसे प्रश्न में कहा गया है) फिट करने की कोशिश की है, समस्या यह है कि फिट पर्याप्त अच्छा नहीं है। मुझे लगता है कि फिट करने के लिए शायद सर्कल (आर्क) के बेहतर हिस्से का उपयोग करने का एक बेहतर तरीका होगा।
bla

@ मुझे समझ में नहीं आता कि आप "फिट सर्कल के शीर्ष भाग" और "सर्कल के बेहतर हिस्से" से क्या मतलब है। आप विभिन्न मैट्रिक्स का उपयोग कर सकते हैं ... बाउंडिंग बॉक्स, प्रमुख अक्ष लंबाई, लघु अक्ष लंबाई, सेंटीरोइड से दूरी, सेंटीरोइड से मध्य दूरी, आदि। यह सब आप क्या चाहते हैं पर निर्भर करता है।
लोरेम इप्सम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.