आपकी दोनों छवियों में ऐसी कई पंक्तियाँ हैं, जिनका आपके द्वारा खोजे जाने वाले साइन से कोई लेना-देना नहीं है। और उन लाइनों में से कुछ अधिक लंबी हैं / उन लाइनों की तुलना में अधिक विपरीत हैं जिन्हें आप वास्तव में चाहते हैं, इसलिए मुझे लगता है कि किनारे की रेखाओं का पता लगाना (उदाहरण के लिए एक हूप ट्रांसफॉर्मेशन का उपयोग करके या इसके विपरीत क्षैतिज / लंबवत रूप से योग करना) काम नहीं करेगा।
लेकिन: आप जिस चिन्ह की तलाश कर रहे हैं उसमें अन्य विशेषताएं हैं जिनका पता लगाना आसान होना चाहिए:
- वहाँ साइन बैकग्राउंड में (लगभग) निरंतर चमक होती है
- यह छवि का एक अपेक्षाकृत बड़ा क्षेत्र लेता है
- यह छवि के केंद्र के पास है
तो आप कम विपरीत के साथ एक बड़े जुड़े क्षेत्र की तलाश कर रहे हैं। मैंने मैथेमेटिका में प्रूफ-ऑफ-कॉन्सेप्ट एल्गोरिथ्म हैक किया है। (मैं एक OpenCV विशेषज्ञ नहीं हूं, लेकिन जब मैं उन्हें जानता हूं तो संबंधित OpenCV फ़ंक्शन का उल्लेख करूंगा।)
सबसे पहले, मैं प्रत्येक पिक्सेल में ढाल परिमाण का पता लगाने के लिए गाऊसी व्युत्पन्न फिल्टर का उपयोग करता हूं। गाऊसी व्युत्पन्न फिल्टर में एक विस्तृत एपर्चर (इस मामले में 11x11 पिक्सेल) है, इसलिए यह बहुत शोर-असंवेदनशील है। मैं तब = 1 के लिए ढाल छवि को सामान्य करता हूं, इसलिए मैं दोनों नमूनों के लिए एक ही थ्रेसहोल्ड का उपयोग कर सकता हूं।
src = Import["http://www.freeimagehosting.net/uploads/720da20080.jpg"];
pixels = ImageData[ColorConvert[src, "Grayscale"]];
gradient = Sqrt[GaussianFilter[pixels, 5, {1, 0}]^2 + GaussianFilter[pixels, 5, {0, 1}]^2];
gradient = gradient/Mean[Flatten[gradient]];
OpenCV कार्यान्वयन: आप sepFilter2D
वास्तविक फ़िल्टरिंग के लिए उपयोग कर सकते हैं , लेकिन जाहिर है, आपको फ़िल्टर कर्नेल मानों की गणना स्वयं करनी होगी ।
परिणाम इस तरह दिखता है:
इस छवि में, साइन बैकग्राउंड अंधेरा है और साइन बॉर्डर चमकीले हैं। इसलिए मैं इस छवि को दूर कर सकता हूं और अंधेरे से जुड़े घटकों की तलाश कर सकता हूं।
binaryBorders = Binarize[Image[gradient], 0.2];
sign = DeleteBorderComponents@ColorNegate[binaryBorders];
largestComponent = SortBy[ComponentMeasurements[sign, {"Area", "ConvexVertices"}][[All, 2]], First][[-1, 2]];
OpenCV कार्यान्वयन: थ्रेसहोल्ड सीधा होना चाहिए, लेकिन मुझे लगता है कि OpenCV में जुड़ा घटक विश्लेषण शामिल नहीं है - आप इसके लिए बाढ़ भरण या cvBlobsLib का उपयोग कर सकते हैं ।
अब, बस छवि के केंद्र के पास सबसे बड़ा ब्लॉब ढूंढें और उत्तल पतवार ढूंढें (मैंने बस सबसे बड़े ब्लॉब का उपयोग किया है जो पृष्ठभूमि से जुड़ा नहीं है, लेकिन यह हर छवि के लिए पर्याप्त नहीं हो सकता है)।
परिणाम: