2012-04-20 21 views
7

में छोटे रूपों को कैसे खत्म करें मैं वर्तमान में छवि प्रसंस्करण प्रोजेक्ट पर काम कर रहा हूं। मैं वीसी ++ के साथ ओपनसीवी 2.3.1 का उपयोग कर रहा हूं। मैंने कोड लिखा है कि, इनपुट छवि केवल नीले रंग के रंग में फ़िल्टर की जाती है और एक बाइनरी छवि में परिवर्तित होती है। बाइनरी छवि में कुछ छोटी वस्तुएं हैं जिन्हें मैं नहीं चाहता हूं। मैं उन छोटी वस्तुओं को खत्म करना चाहता था, इसलिए मैंने बाइनरी छवि में समोच्चों का पता लगाने के लिए ओपनसीवी की cvFindContours() विधि का उपयोग किया। लेकिन समस्या यह है कि मैं छवि आउटपुट में छोटी वस्तुओं को खत्म नहीं कर सकता। मैंने cvContourArea() फ़ंक्शन का उपयोग किया, लेकिन ठीक से काम नहीं किया .., एरोड फ़ंक्शन भी ठीक से काम नहीं करता था।कॉन्टूर ओपनसीवी: बाइनरी छवि

तो किसी को इस समस्या के साथ मेरी मदद कृपया ..

द्विआधारी छवि है जो मैं प्राप्त:

enter image description here

परिणाम/आउटपुट छवि है जो मैं प्राप्त करने के लिए करना चाहते हैं:

enter image description here

उत्तर

1

क्या आप निश्चित रूप से छोटे समोच्च क्षेत्र द्वारा फ़िल्टरिंग काम नहीं कर रहे हैं? यह हमेशा मेरे लिए काम करता है। क्या हम आपका कोड देख सकते हैं?

इसके अलावा, मुकदमा के रूप में उल्लेख किया गया है, यह एक अच्छा विचार है कि दोनों ईरोड का उपयोग करना और लगभग संरक्षित क्षेत्र को फैलाना अच्छा विचार है। छोटे शोर बिट्स को हटाने के लिए, पहले ईरोड का उपयोग करें, और छेद भरने के लिए, पहले फैलाने का उपयोग करें।

और एक और एक तरफ, आप नए सी ++ cv * कार्यों के संस्करणों की जाँच करने के लिए चाहते हो सकता है अगर आप (documentationfindContours के लिए) पहले से ही उनमें से अवगत नहीं थे। मेरी राय में, उनका उपयोग करना बहुत आसान है।

+0

सुझाव के लिए धन्यवाद, लेकिन मुझे पता नहीं चला है कि प्रत्येक ब्लॉब/समोच्च के क्षेत्र को खोजने के लिए कोड कैसे लिखना है। जो कोड मैंने लिखा है वह निम्न लिंक में है। क्या आप इसे सही कर सकते हैं और जवाब दे सकते हैं। : http://textuploader.com/?p=6&id=YwRl। –

+0

ओह! मैं बस भूल गया, cvutility के लिए हेडर और सीपीपी फ़ाइल इन लिंक में पाया जा सकता है: http: //textuploader.com/? पी = 6 और आईडी = डीटीएनवीजे http://textuploader.com/?p=6&id=TSlRQ कृपया उन्हें शामिल करें स्रोत निर्देशिका और पथ शामिल हैं। –

+0

मैं सी एपीआई से बहुत परिचित नहीं हूं, लेकिन ऐसा लगता है कि आप केवल पहले समोच्च के क्षेत्र की गणना कर रहे हैं। आपको समोच्चों के माध्यम से पुन: प्रयास करने की आवश्यकता है और केवल क्षेत्र> कुछ थ्रेसहोल्ड वाले लोगों को आकर्षित करें। यदि आप केवल एक वस्तु को खोजने की कोशिश कर रहे हैं, तो आपको समोच्च को सबसे बड़े क्षेत्र के साथ आकर्षित करना चाहिए। – fferen

0

से पहले से और छवियों के बाद परखने के बाद, आप सभी सफेद क्षेत्रों या धब्बे के क्षेत्र का निर्धारण करने के लिए, तो एक सीमा क्षेत्र मूल्य लागू की जरूरत है। यह सभी क्षेत्रों मूल्य से कम को खत्म करने और केवल बड़े सफेद क्षेत्र है जो 2 छवि में देखा जाता है छोड़ना होगा। CvFindContours फ़ंक्शन का उपयोग करने के बाद, 0 ऑर्डर पलों का उपयोग करने का प्रयास करें। यह छवि में ब्लब्स के क्षेत्र को वापस कर देगा। यह लिंक जो मैंने अभी वर्णित किया है उसे लागू करने में सहायक हो सकता है। http://www.aishack.in/2010/07/tracking-colored-objects-in-opencv/

+0

सुझाव के लिए धन्यवाद, लेकिन मुझे पता नहीं है कि प्रत्येक ब्लॉब/समोच्च के क्षेत्र को खोजने के लिए कोड कैसे लिखना है। –

+0

सुझाव के लिए धन्यवाद, लेकिन मुझे पता नहीं चला है कि प्रत्येक ब्लॉब/समोच्च के क्षेत्र को खोजने के लिए कोड कैसे लिखना है। जो कोड मैंने लिखा है वह निम्न लिंक में है। क्या आप इसे सही कर सकते हैं और जवाब दे सकते हैं। : http://textuploader.com/?p=6&id=YwRl। –

+0

ओह! मैं बस भूल गया, cvutility के लिए हेडर और सीपीपी फ़ाइल इन लिंक में पाया जा सकता है: http: //textuploader.com/? पी = 6 और आईडी = डीटीएनवीजे http://textuploader.com/?p=6&id=TSlRQ कृपया उन्हें शामिल करें स्रोत निर्देशिका और पथ शामिल हैं। –

10

ठीक है, मेरा मानना ​​है कि आपकी समस्या the bounding box demo हाल ही में OpenCV द्वारा शुरू से हल किया जा सकता है।

enter image description here

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

+0

thnx .. मैं इसे देख लूंगा। –

7

यहाँ छोटे आकृति को खत्म करने के लिए अपने समाधान है। मूल विचार प्रत्येक समोच्च के लिए जाँच लंबाई/क्षेत्र है, तो वेक्टर कंटेनर से छोटे को हटाकर उसकी जगह है।

सामान्य रूप से आप इस

Mat canny_output; //example from OpenCV Tutorial 
vector<vector<Point> > contours; 
vector<Vec4i> hierarchy; 
Canny(src_img, canny_output, thresh, thresh*2, 3);//with or without, explained later. 
findContours(canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0,0)); 
कैनी() पूर्व प्रसंस्करण के साथ

की तरह आकृति मिलता है, आप समोच्च क्षेत्रों मिल जाएगा जाएगा, हालांकि प्रत्येक खंड एक बंद अंगूठी के रूप में सीमा पिक्सल के साथ संग्रहीत किया जाता है।इस मामले में, आप लंबाई की जांच और बिना कैनी() पूर्व प्रसंस्करण की तरह

for (vector<vector<Point> >::iterator it = contours.begin(); it!=contours.end();) 
{ 
    if (it->size()<contour_length_threshold) 
     it=contours.erase(it); 
    else 
     ++it; 
} 

छोटे से एक को हटा सकते हैं, आप वस्तुओं की रूपरेखा मिल जाएगा। समानता, आप भी एक सीमा से परिभाषित करने के लिए क्षेत्र का उपयोग छोटी वस्तुओं को खत्म करने के कर सकते हैं,) OpenCV ट्यूटोरियल दिखाया

vector<Point> contour = contours[i]; 
double area0 = contourArea(contour); 

इस contourArea (गैर शून्य पिक्सेल की संख्या है के रूप में

0

मेरा मानना ​​है कि आप रूपात्मक उपयोग कर सकते हैं ऑपरेटरों जैसे ईरोड और फैलाएं (here पढ़ें)

आपको दाईं ओर सर्कल के त्रिज्या के पास कर्नेल आकार के साथ क्षरण करने की आवश्यकता है (जिसे आप खत्म करना चाहते हैं)। क्षरण चरण द्वारा बनाए गए अंतराल को भरने के लिए उसी कर्नेल का उपयोग करके फैलाव के बाद।

एफवाईआई क्षरण के बाद उसी कर्नेल का उपयोग करके फैलाव को खोलने के लिए कहा जाता है।

कोड इस

int erosion_size = 30; // adjust with you application 
Mat erode_element = getStructuringElement(MORPH_ELLIPSE, 
         Size(2*erosion_size + 1, 2*erosion_size+1), 
         Point(erosion_size, erosion_size)); 
erode(binary_img, binary_img, erode_element); 
dilate(binary_img, binary_img, erode_element); 
0

की तरह कुछ यह एक तेज तरीका नहीं है हो जाएगा लेकिन कुछ मामलों में उपयोगी हो सकता है। ओपनसीसीवी 3.0 - कनेक्टेड कॉम्पोनेंट्स विथस्टैट्स में एक नया फ़ंक्शन है। इसके साथ हम जुड़े घटकों का क्षेत्र प्राप्त कर सकते हैं और अनावश्यक को खत्म कर सकते हैं। तो हम ठोस सर्कल के समान बाउंडिंग बॉक्स के साथ, छेद के साथ सर्कल को आसानी से हटा सकते हैं।

संबंधित मुद्दे