7

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

मैं इस चयन से क्या चाहते हैं केवल outter हिस्सा है, जो मैं अगली फिल्म में हरे रंग के रूप में चिह्नित किया है। मेरे खराब ड्राइंग कौशल के लिए खेद है। ;)

मैं आईपीटी के साथ मैटलैब का उपयोग कर रहा हूं। इसलिए मैंने bwmorph और hbreak विकल्प के साथ बाहर निकलने का प्रयास किया, लेकिन यह एक त्रुटि फेंक दी।

मैं उस समस्या को कैसे हल करूं? यदि आप सफल थे तो कृपया मुझे इसके बारे में कुछ और बताएं? अग्रिम धन्यवाद!

निष्ठा से

उत्तर

1

मैं भी bwmorph

%# find the branch point 
branchImg = bwmorph(img,'branchpoints'); 

%# grow the pixel to 3x3 
branchImg = imdilate(branchImg,ones(3)); 

%# hide the branch point 
noBranchImg = img & ~branchImg; 

%# label the three lines 
lblImg = bwlabel(noBranchImg); 

%# in the original image, mask label #3 
%# note that it may not always be #3 that you want to mask 
finalImg = img; 
finalImg(lblImg==3) = 0; 

%# show the result 
imshow(finalImg) 
+0

आपने उल्लेख किया कि यह हमेशा 3 नहीं हो सकता ... इसके पीछे क्या कारण है? मेरी समझ के लिए यह हमेशा एक 1px चौड़ाई वाली रेखा/समोच्च है, जो उस पैटर्न (3) के फिट बैठता है ..? – mchlfchr

+0

@mchlfchr: 'bwlabel' चरण में, तीन डिस्कनेक्टेड लाइन क्रमशः लेबल 1,2, और 3 असाइन की जाती हैं। यह हमेशा 3 लेबल वाला हिस्सा नहीं हो सकता है जिसे आप निकालना चाहते हैं। – Jonas

+0

इसलिए किसी भी मामले के लिए "बाहरी" रेखा का चयन करना संभव नहीं है? जैसा कि मैंने 'हैकब्रे' तरीके को समझा, यह इस तरह के ट्रिपल कनेक्टेड संरचनाओं को अलग करता है? अगले चरण में मैंने उस बाहरी लेबल का चयन किया होगा, लेकिन उस विकल्प के लिए 'hbreak' काम नहीं कर रहा है। – mchlfchr

2

प्रयोग करेंगे ऐसा लगता है अपने इनपुट छवि एक तुम्हें तैनात की तुलना में थोड़ा अलग है, के बाद से मैं सीधे शाखा अंक नहीं एकत्र कर पाया है (वहाँ थे उनमें से बहुत से)। तो, अपनी समस्या को संभालने शुरू करने के लिए मैं शाखा बिंदु पहचान के बाद एक पतला पर विचार कर रहा हूं। मैं उन्हें पतला कर देता हूं और पतली छवि से हटा देता हूं, यह गारंटी देता है कि वास्तव में प्रारंभिक छवि में विभिन्न सेगमेंट के बीच कोई कनेक्शन (4 या 8) नहीं है।

f = im2bw(imread('http://i.imgur.com/yeFyF.png'), 0); 
g = bwmorph(f, 'thin', 'Inf'); 
h = g & ~bwmorph(bwmorph(g, 'branchpoints'), 'dilate'); 

h के बाद से कट क्षेत्रों रखती है, निम्नलिखित आपरेशन सभी खंडों के अंत अंक एकत्र करता है:

u = bwmorph(h, 'endpoints'); 

अब वास्तव में क्या आप अभी नहीं करना चाहते पर आपकी समस्या मैं कुछ त्वरित विश्लेषण किया था हल करने के लिए। h में दो अलग-अलग सेगमेंट, a और b पर विचार करें। हम कहते हैं कि a और b ओवरलैप हैं यदि किसी के अंतिम बिंदु दूसरे में निहित हैं। निहित द्वारा मेरा मतलब यह है कि यदि एक का प्रारंभिक एक्स बिंदु दूसरे के बराबर या बराबर है, और अंतराल x बिंदु भी बड़ा या बराबर है। आपके मामले में, "पहाड़" उस सेगमेंट के साथ ओवरलैप करता है जिसे आप निकालना चाहते हैं। उनमें से प्रत्येक को हटाने के लिए, अपने क्षेत्र पर विचार करें। लेकिन, चूंकि ये खंड हैं, क्षेत्र एक अर्थहीन शब्द है। इसे संभालने के लिए, मैंने एक सेगमेंट के अंतिम बिंदुओं को जोड़ा, और क्षेत्र के रूप में केवल आंतरिक बिंदुओं के रूप में उपयोग किया। जैसा कि आप स्पष्ट रूप से ध्यान दे सकते हैं, नीचे ओवरलैप्ड सेगमेंट का क्षेत्र बहुत छोटा है, इसलिए हम कहते हैं कि यह मूल रूप से एक रेखा है और "पहाड़" खंड को रखते हुए इसे छोड़ दें। इस चरण को करने के लिए छवि u मौलिक महत्व का है, क्योंकि इसके साथ आपको एक स्पष्ट संकेत है कि कहां से शुरू करना और बंद करना बंद करना है। यदि आपने छवि h का उपयोग किया है, तो आपको यह निर्धारित करने में परेशानी होगी कि कहां से शुरू करना है और एक समोच्च के बिंदु एकत्र करना बंद करना है (यानी, रास्टर ऑर्डर आपको गलत ओवरलैपिंग संकेत देगा)।

एक भी एक के रूप में खंड को फिर से संगठित करने के लिए (वर्तमान में आप उनमें से तीन है), अंक आप h में g से खारिज कर दिया पर विचार करें, और उन है कि अब से हटाया नीचे खंड से संबंधित नहीं है का उपयोग करें।

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