2011-09-14 16 views
10

मैं एक काले रंग की & सफेद छवि पर सिर्फ पहले एक लिंक से की तरह काम कर रहा हूँ: http://imageshack.us/g/33/firstwm.png/ यह 'शोर' का एक बहुत तो मैं एक माध्य फिल्टर के साथ यह यह आसान करने के लिए, इस प्रकार दूसरा चित्र हो रही लागू की है।ओपनसीवी में वक्र (समोच्च) को कैसे चिकनी बना सकता हूं?

cvSmooth(TempImage, TempImage, CV_MEDIAN, 5, 0); 

इसके बाद मुझे समोच्च मिलते हैं और उन्हें लिंक से तीसरी तस्वीर की तरह दूसरी छवि पर खींचते हैं। मेरी समस्या यह है कि समोच्च अभी भी थोड़ा पिक्सलेटेड (edgy) हैं। बेहतर समोच्च प्राप्त करने के लिए बी & डब्ल्यू छवि को और भी आसान बनाने का कोई तरीका है? या शायद समोच्चों के साथ कुछ करो। मैंने अलग-अलग कर्नल के साथ दिलेट और ईरोड को भी आजमाया है लेकिन समस्या एक ही है। मदद करने वाली किसी भी चीज के लिए धन्यवाद।

संपादित करें: भी करने की कोशिश की:

cvSmooth(TempImage, TempImage, CV_GAUSSIAN, 9, 9, 3); 
cvThreshold(TempImage, TempImage, 127, 255, CV_THRESH_BINARY); 

मंझला फिल्टर के रूप में एक ही परिणाम है, ठीक है, लेकिन अभी भी कुछ pixelated आकृति छोड़ देता है।

+1

एक गाऊसी कर्नेल के माध्यम से पासिंग, और फिर thresholding यह किनारों बाहर smoothen चाहिए:

अपडेट 2 समोच्च संस्करण कुछ इस तरह होगा। शायद यह परिणाम आप चाहते हैं? – swalog

+0

मैं यह धारणा बना रहा हूं कि आप जिस "शोर" के बारे में बात कर रहे हैं वह उच्च आवृत्ति घटक है जो आपने अपने दूसरे उदाहरण में हटा दिया था। क्या यह [http://i.imgur.com/33GIT.png) वांछित आउटपुट है? यदि केवल बाइनरी आउटपुट वांछित है, तो एक [हार्ड थ्रेसहोल्ड] (http://i.imgur.com/VelRg.png) निकटतम चीज़ होगी। – swalog

+0

हां, वांछित आउटपुट शोर को हटाने के लिए जितना संभव हो उतना चिकनी रूप से निकालना है, मैंने आपके सुझाव पर गॉसियन + थ्रेसहोल्ड भी कोशिश की है लेकिन मध्यवर्ती फ़िल्टर के समान परिणाम प्राप्त कर रहे हैं। – Adrian

उत्तर

8

enter image description here

इस समरेखण परिणाम आप के बाद कर रहे हैं है, तो यह एक गाऊसी कलंक, एक थ्रेशोल्डिंग द्वारा पीछा कर रही द्वारा प्राप्त किया जा सकता है। अर्थात। cvSmooth का उपयोग CV_GAUSSIAN के साथ पैरामीटर के रूप में करें। cvThreshold द्वारा पीछा किया गया।

यदि आप थ्रेसहोल्डिंग (जैसे this) की तुलना में एक आसान संक्रमण चाहते हैं, तो आप इसे स्तर समायोजित करने के साथ प्राप्त कर सकते हैं (रंग सीमा को रीमेप करना ताकि आप किनारे के संक्रमण को संरक्षित कर सकें)।

अद्यतन कैसे, थ्रेशोल्डिंग पर चिकनी (विरोधी aliased) बढ़त पाने पर विचार क्या थ्रेशोल्डिंग करता है करने के लिए की व्याख्या करने के। यह मूल रूप से छवि में प्रत्येक पिक्सेल को एक समय में संसाधित करता है। यदि पिक्सेल मान थ्रेसहोल्ड से कम है, तो यह काला (0) पर सेट है, अगर यह सफेद पर सेट नहीं है (255)।

थ्रेसहोल्ड ऑपरेटर इस प्रकार बहुत सरल है, हालांकि, कोई अन्य सामान्य मैपिंग फ़ंक्शन का उपयोग किया जा सकता है। असल में यह एक फ़ंक्शन f(i) है, जहां i तीव्रता पिक्सेल मान (0-255 से लेकर) और f(i) मैप किए गए मान है। सीमा के लिए इस समारोह सरल

f(i) = { 0, for i < threshold 
      255, for i >= threshold 

है क्या आपके पास एक सरल छवि (cvSmooth द्वारा एक गाऊसी गिरी है, जो आपको, "सहज" समरेखण देता है कि अगर समझ में आता है का उपयोग) है। इस प्रकार आपके पास 0 से 255 तक के किनारों पर मूल्यों का नरम संक्रमण होता है। आप जो करना चाहते हैं वह इस संक्रमण को बहुत छोटा बना देता है, ताकि आपको एक अच्छा बढ़त मिल सके। यदि आप उस पर बैलिस्टिक जाते हैं, तो आप सीधे 0 से 255 तक जाते हैं, जो कि आपके द्वारा पहले से किए गए बाइनरी थ्रेसहोल्डिंग जैसा ही है।

अब, एक ऐसे फ़ंक्शन पर विचार करें जो नक्शा, शायद 4 तीव्रता मानों (127 + - 4) की एक श्रृंखला को 0-255 की पूरी श्रृंखला तक ले जाएं। अर्थात।

  f(i) = { 0, for i < 123 
        255, for i >= 131 
     linear mapping, for 123 <= i < 131 

और आपको वांछित आउटपुट मिलता है। मैं एक त्वरित रूप से देखूंगा और देख सकता हूं कि इसे ओपनसीवी में पहले से लागू किया गया है या नहीं। यद्यपि इसे स्वयं कोड करने के लिए बहुत कठिन नहीं होना चाहिए।

   f(i) = { 255, for  i < 122 
    linear mapping (255->0), for 122 <= i < 126 
         0, for 126 <= i < 127 
    linear mapping (0->255), for 127 <= i < 131 
         255, for 131 <= i 
+0

ओह, अब मैं समझ रहा हूं कि आप क्या कह रहे हैं, इसके लिए मैं cvThreshold के बजाय cvLUT का उपयोग कर सकता हूं। लेकिन अब जब मैं कॉन्टूर प्राप्त करने के लिए cvFindContours को लागू करने के बाद इसके बारे में सोचता हूं तो मैं पिक्सलेटेड समोच्च पर वापस आऊंगा :(। प्रतिक्रिया के लिए धन्यवाद, अगर कुछ दिनों में कोई बेहतर जवाब पॉप अप नहीं होता है, तो मैं तुम्हारा निशान चिन्हित करूंगा सही। – Adrian

+0

ध्यान दें कि आपके पास चिकनाई ऑपरेशन के बाद चिकनी ढाल वाला किनारा है। सीवीएलयूटी और सही टेबल मानों का उपयोग करके एक अच्छी लग रही समोच्च छवि प्राप्त करना अभी भी संभव होना चाहिए। संक्षेप में इसमें तीन श्रेणियां होंगी, सफेद से काले (रेखा से शुरू) काले से काले (रेखा के अंदर) और काले से सफेद (रेखा के अंत) से। यदि ऊपर की तरह एक ही संरचना का पालन किया जाता है। इसके बाहर के सभी मूल्यों को भी सफेद पर मैप किया जाता है। इस प्रकार आप एक अच्छी लग रही हो समोच्च :) – swalog

+0

उत्तर में अद्यतन 2 देखें। मैं सिर्फ अच्छे मूल्यों का अनुमान लगा रहा हूं, इसलिए आप इसके साथ खेलना चाहेंगे :) – swalog

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