छवि में वर्ग ढूँढना


34

मुझे ओपनसीवी (मैटलैब में कोई समस्या नहीं है या किसी अन्य, आमतौर पर मैं कुछ विचारों की अपेक्षा करता हूं) का उपयोग करके एक छवि में वर्गों को खोजने की आवश्यकता है।

नीचे परीक्षण छवि पर विचार करें:

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

मुझे ऊपर की छवि में उन रंगीन वर्गों को सटीक रूप से खोजने की आवश्यकता है (सफेद लंबी स्ट्रिप्स नहीं)।

मैंने क्या किया है :

  • मैंने सामान्य विधि (जो OpenCV के नमूनों के साथ आती है) लागू की, अर्थात सभी रंग विमानों में समरूपता प्राप्त करें, इसे अनुमानित करें और तत्वों की संख्या = 4 की जांच करें। यह कुछ विस्तार करने के लिए काम करता है, कुछ वर्गों का पता लगाया जाता है, विशेष रूप से अंधेरे वाले।

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

लेकिन मुझे लगता है कि यहाँ भविष्यवाणी एक अच्छी पद्धति नहीं है और यह हमेशा सटीक उत्तर नहीं देती है जैसा कि पहले चरण में दिया गया है।

क्या चाहिए मुझे :

1) क्या इन चौकों का अधिक सटीक पता लगाने के लिए कोई अन्य बेहतर तरीका है? या कई तरीके?

एक महत्वपूर्ण बिंदु यह है कि, समय यहाँ कोई समस्या नहीं है । एल्गोरिथ्म धीमा हो सकता है, इससे कोई फर्क नहीं पड़ता। लेकिन सटीकता प्रमुख मापदंड है।

कभी-कभी, छवियां बहुत अधिक धुंधली हो सकती हैं।

और मैंने जो एक बड़ी समस्या का सामना किया है, वह यह है कि कुछ वर्गों में पृष्ठभूमि के समान रंग (चेक कॉलम 3 पहले और दूसरे वर्ग) हैं।

विचारों की तलाश, अग्रिम धन्यवाद

अद्यतन करें :

नीचे दिया गया अधिकतम सटीक परिणाम है:

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

बेशक, परिणाम छवि को थोड़ा बदल दिया जाता है।

अद्यतन 2:

मैंने नीचे दिए गए अपने उत्तर में अधिक बेहतर समाधान दिया है: https://dsp.stackexchange.com/a/7526/818


क्या आपकी पृष्ठभूमि हमेशा सफेद रहती है?

1
मेरा विचार "संतृप्ति" की गणना करना और संतृप्त img को थ्रेशोल्ड करना था लेकिन आपके उदाहरण का उपयोग करना बहुत अच्छी तरह से काम नहीं करता है (अधिकतम संतृप्ति (आरजी, आरबी, जीबी) के रूप में संतृप्ति। तथ्य यह है कि कुछ वर्ग लगभग पृष्ठभूमि की तरह दिखते हैं। बात काफी कठिन है। यदि आपकी सभी छवियों में समान पैटर्न है (उनके बगल में वर्गों के साथ लंबी सफेद धारियां) तो आपको सबसे आसान बिट्स (जैसे कि वास्तव में रंगीन वर्ग, या सफेद धारियों) को खोजने पर विचार करना चाहिए, अन्य के लिए संभावित स्थान को कम कर सकते हैं। चौकों और ... यह जांचने का एक तरीका खोजें कि क्या वे वास्तव में वहां हैं या नहीं। लेकिन बहुत दिलचस्प! क्या आप अधिक चित्र दे सकते हैं?

खैर, मुझे लगता है कि इसे स्थानांतरित नहीं किया जाना चाहिए था।
Junuxx

1
क्या आप अधिक चित्र प्रदान कर सकते हैं? यह भी कि यह क्या चीज है?
एंड्री रुबेश्टिन

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

जवाबों:


9

मतलाब का उपयोग करते हुए पहला प्रयास:

im = imread('squares.jpg');
im2 = rgb2gray(im);

se = strel('disk', 15);

for i = 1:16;
    t = 60+i*5; % try out a range of bw thresholds to see what works best
    labelled = bwlabel(im2>t); % label regions in the BW image
    closed = imclose(labelled, se); % close small regions
    cleared = imclearborder(~closed,4); % clear regions touching the border
    subplot(4,4,i); 
    imshow(cleared); 
    title(['T = ' num2str(t)]);
end

निम्नलिखित क्षेत्रों में परिणाम:

लेबल वाले क्षेत्र

जैसा कि आप देख सकते हैं, सबसे अधिक संख्या में क्षेत्रों (T = 120) के परिणामस्वरूप थ्रेशोल्ड का चयन करना पहले से ही 7 सही स्थान, कुछ मर्ज किए गए स्थान, एक गलत सकारात्मक और दो झूठे नकारात्मक देगा।

यह काफी सरल प्रयास था लेकिन मुझे लगता है कि यह दर्शाता है कि दृष्टिकोण काम करता है। बढ़े हुए क्षेत्रों को तोड़ने के लिए कुछ सामान जोड़ना, या प्रत्येक रंग चैनल के लिए अलग से ऐसा करना बस कुछ चीजें हैं जो आप इस पर सुधार कर सकते हैं।

यदि आप कुछ और परीक्षण चित्र प्रदान करते हैं, तो यह भी मदद करेगा।


8

मैंने प्रश्न में अपने परिणाम को बेहतर बनाने के लिए कुछ और कोशिश की थी। नीचे समाधान इस धारणा पर है कि पहला वर्ग (नारंगी) हमेशा चरण 1 में पाया जाता है। और यह पृष्ठभूमि के मुकाबले अपने उच्च विपरीत रंग के कारण व्यावहारिक है। यहां तक ​​कि मैंने जो परिणाम प्रश्न में दिखाया है, उसे सही ढंग से पता चला है

चरण 1: संभव के रूप में कई वर्गों का पता लगाएं

मैंने छवि को R, G, B, H, S, V विमानों से विभाजित किया है और विभिन्न थ्रेशोल्ड मानों जैसे 25 के गुणकों के लिए छवि को थ्रेसहोल्ड किया है। प्रत्येक छवि के लिए, मुझे इसमें स्क्वायर मिले, और उन्हें "मास्क छवि" पर रखा । मुझे वर्ग की औसत ऊँचाई और चौड़ाई भी मिली।

मुखौटा छवि (कुल 7/12 वर्ग का पता चला):

मुखौटा छवि

चरण 2: वर्गों का एक ग्रिड बनाएं

आगे मुझे मुखौटा छवि में इन वर्गों के केंद्रक मिले। उन्हें क्रमबद्ध किया और पहले वर्ग (नारंगी) का केंद्रक पाया। निकट विश्लेषण से, हम देख सकते हैं कि दो वर्गों के बीच अंतर क्षैतिज और ऊर्ध्वाधर दोनों दिशाओं में एक वर्ग है। तो इस तरह, मैंने नीचे की तरह वर्गों का एक ग्रिड बनाया और इसे ideal_squares कहा (यह सिर्फ एक नाम है, इसका मतलब यह नहीं है कि यह मेरी ज़रूरत का उत्पादन है):

आइडियल_सक्सेस:

आदर्श छवि

चरण 3: आदर्श_ रिमैप को रिमैप करें

अब हमारे पास ideal_squares केन्द्रक और मूल केन्द्रक हैं। मैंने प्रत्येक मूल सेंट्रोइड के लिए आदर्श_सेन्ट्रोइड्स (उनके बीच यूक्लिडियन दूरी लेते हुए) के लिए सही मिलान पाया। तब मैं प्रक्षेप के लिए SciPy interpolate.griddata का इस्तेमाल किया और केन्द्रक मूल्यों के अनुसार ideal_image पुनः मानचित्रित (यह में किया मुड़ने के रूप में लगभग एक ही है इन क्यू एंड ए: सुडोकू वर्ग में उत्तलता दोष दूर करने के लिए कैसे और OpenCV में चित्र रूपांतरण )। इसलिए नीचे दिया गया आउटपुट है:

आउटपुट:

आउटपुट छवि

चरण 4: या पहले चरण से मुखौटा छवि के साथ आउटपुट से ऊपर काम करते हैं

अंतिम उत्पादन

अब आप देख सकते हैं कि सभी वर्गों का पता लगाया गया है, लेकिन नीचे उल्लिखित समस्या के साथ:

संकट :

चरण 3 के आउटपुट को देखें, अर्थात वर्गाकार ग्रिड की रीमैप की गई छवि। दो केंद्रीय वर्गों को छोड़कर, अन्य सभी वर्ग क्लिप किए गए हैं। यह इस रीमैपिंग से जुड़ी समस्या है। मुझे यकीन नहीं है कि समस्या कहां है, scipy.interpolate.griddata () या cv2.remap () के साथ। मुझे लगा कि पूरी छवि खराब हो जाएगी, लेकिन ऐसा नहीं है। यह हमारे द्वारा दिए गए सेंट्रोइड्स के अंदर केवल छवि को दर्शाता है। अगर मैं इसे ठीक कर सकता हूं, तो आउटपुट ठीक होगा।

तो अगर किसी को उस के लिए एक अच्छा विचार पता है, सबसे स्वागत है !!!


5

नोट: यह विधि वास्तव में धीमी होने जा रही है।

एक मुखौटा बनाएं जो एक आदर्श वस्तु के आकृति की तरह दिखता है। इसके समान:

वस्तु का मुखौटा

फिर स्लाइड (स्थिति, स्केल, रोटेशन) छवि पर मुखौटा और वास्तविक छवि के समोच्च के साथ मैच (शायद नरम प्रतिक्रिया प्राप्त करने के लिए थोड़ा धुंधला) वे कैसे, इस स्थिति (स्थिति, पैमाने, रोटेशन) के समान हैं। उच्चतम समानता प्रतिक्रिया वास्तविक वस्तु की स्थिति (स्थिति, स्केल, रोटेशन) होनी चाहिए।

यह विधि मन में नहीं आती है कि यह पूरी वस्तु पर विचार करने के बाद पृष्ठभूमि या वस्तु के आंशिक रूप से सम्मिश्रण करता है।

मैंने व्यक्तिगत रूप से एक माउस थूथन और मूंछ को ट्रैक करने के लिए सफलतापूर्वक इस पद्धति का उपयोग किया है, लेकिन मेरे पास कुछ अनुमान थे जैसे कि यह अंतिम ज्ञात स्थिति के करीब था, लेकिन मुझे लगता है कि आप कुछ मान्यताओं को लागू करके खोज-स्थान को नीचे ला सकते हैं: संभव आकार कैमरे में वस्तु, केंद्र से कितनी दूर हो सकती है या घूम सकती है <10degrees आदि।


5

चरण 1: बी, जी, आर, एच, एस, वी विमान में विश्लेषण से जो भी अंतिम द्विआधारी छवि आपको मिल रही है, उस छवि में एक बूँद गिनती एल्गोरिथ्म है।

चरण 2: क्षेत्रफल या समोच्च लंबाई के आधार पर सबसे बड़ी बूँद खोजें। चूँकि आपकी बूँदें ज्यादातर समांतर चतुर्भुज प्रकार होंगी इसलिए क्षेत्र या समोच्च, कोई भी करेगा।

चरण 3: सबसे बड़ी बूँद के साथ (क्योंकि सबसे बड़ी बूँद आपके असली दुनिया के वर्गों से मिलती-जुलती सबसे अच्छी बूँद है) बूँद के उन्मुखीकरण का पता लगाने की कोशिश करें ... यह आपको एक उपयुक्त फिट आयत द्वारा मिल सकता है या आप कोने के अंक प्राप्त कर सकते हैं ... उन्हें (क्षितिज और ऊर्ध्वाधर दोनों दिशाओं में) मिलाने वाली रेखाओं का ढलान प्राप्त करें।

चरण 4: एक बार जब आप दो ढलान प्राप्त करते हैं तो बूँद के अक्ष के माध्यम से चलने वाली दो रेखाएँ खींचते हैं। अक्ष के लिए आप कोने के बिंदुओं को औसत कर सकते हैं या आप सेंट्रोइड (द्रव्यमान का केंद्र) का उपयोग कर सकते हैं ... मैं कोने के बिंदुओं के औसत के साथ जाऊंगा ...

चरण 5: चूंकि प्रत्येक क्षैतिज और ऊर्ध्वाधर दिशा में, रिक्ति समान है (आदर्श रूप से क्षैतिज और ऊर्ध्वाधर रिक्ति भी समान है क्योंकि यह आपके आदर्श वर्ग चित्र से आता है लेकिन हम इसे नहीं मानेंगे ..) बस दूसरे के संभावित सेंट्रोइड का पता लगाने की आवश्यकता है समानांतर चतुर्भुज

बॉटम लाइन: यदि किसी एक वर्ग का पूरी तरह पता लग जाए तो आप पूरी ग्रिड बना सकते हैं। बस 2H (H = सबसे बड़ी बूँद की क्षैतिज चौड़ाई) के अंतराल पर अंकन केंद्र रखें, सबसे बड़ी बूँद के क्षैतिज अक्ष के साथ और 2V के अंतराल पर (V = सबसे बड़ी बूँद की लंबवत ऊँचाई) खड़ी धुरी के ऊर्ध्वाधर अक्ष के साथ।

समर्थन करने के लिए कुछ तस्वीरें यहाँ छवि विवरण दर्ज करें

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


1
+1 - यदि आप इसे लागू कर सकते हैं तो बहुत अच्छा होगा।
आबिद रहमान के

2
@AbidRahmanK वह नहीं है जो StackExchange है। प्रश्न -> उत्तर। अन्यथा यह एक रोजगार मेला होगा।
Jan Krüger

2

यह व्यवस्था ठीक है

मैं वास्तव में नहीं जानता कि आपने पहले किस तरह की भविष्यवाणी की थी, लेकिन क्या आपने जड़ के रूप में सफेद लंबी पट्टियों पर ध्यान केंद्रित करने की कोशिश की है। तब (यदि वर्गों के 3 स्तंभ समान आकार के हैं), तो आप एक वर्ग की ऊंचाई (दो स्ट्रिप्स के बीच की दूरी) का पता लगा सकते हैं और आप छवि में अधिकतम और न्यूनतम क्षेत्र (ऊंचाई और चौड़ाई) का पता लगा सकते हैं।

फिर, अपने पूरे वर्ग के अंदर सबसे आम रंग का पता लगाने की कोशिश करें और इसे "गैर-वर्ग" क्षेत्र में सेट करें। बाकी आप के लिए देख रहे हैं वर्गों होना चाहिए।


मुझे समोच्च विधि का उपयोग करके 3-4 वर्ग मिले। फिर प्रत्येक वर्ग की ऊंचाई और चौड़ाई मिली। फिर पता लगाए गए चौकों के बीच की खाई की जाँच की और मान लिया कि उनके बीच का अंतर एक और वर्ग रखने के लिए पर्याप्त है। यह मेरे द्वारा की गई भविष्यवाणी है।
आबिद रहमान के

कुछ वर्गों में पृष्ठभूमि के समान रंग होते हैं। इसलिए मुझे डर है, उन्हें आपकी विधि के अनुसार गैर-वर्ग क्षेत्र के रूप में भी माना जाएगा।
आबिद रहमान के

हो सकता है कि आप एक वक्र की साजिश करने के लिए हर स्तंभ पर काम करने की कोशिश कर सकते हैं जहां छवि में x अक्ष ऊंचाई (पिक्सेल में) होगा और y अक्ष तीव्रता होगी। फिर, आप व्युत्पन्न रूप के साथ कुछ कटिंग किनारों को खोजने की कोशिश कर सकते हैं।

कि बढ़त का पता लगाने में ही है, है ना? मैंने इसे आजमाया, लेकिन अच्छा परिणाम नहीं मिला।
आबिद रहमान के

1
हाँ यह है, लेकिन आप स्वयं देख सकते हैं कि यह विफल क्यों है और शायद कुछ दिलचस्प क्षेत्रों को अलग कर सकता है। वैसे, अगर आपको अपनी समस्या को हल करने के लिए कुछ उपयोगी सुझाव मिलते हैं, तो कृपया उन्हें पोस्ट करें। आपके शोधों के लिए शुभकामनाएँ

0

मेरा सुझाव है कि Hough ट्रांसफॉर्मेशन का उपयोग करना, जो सरल पैरामीट्रिक आकृतियों जैसे लाइनों, सर्कल आदि को खोजने के लिए एक बहुत ही मजबूत एल्गोरिदम है। लाइनों का पता लगाना आपके मामले में सबसे अच्छा होगा। आप कम से कम लंबे सफेद धारियों के किनारे पा सकते हैं; फिर, किसी भी कोने के एक्सट्रैक्टर एल्गोरिथ्म (हैरिस या शायद SIFT या SURF) के साथ, आप उन पंक्तियों के साथ कोनों को पा सकते हैं, यहां तक ​​कि इस तथ्य का उपयोग करते हुए कि वर्ग लगभग समान रूप से दूरी पर हैं।


0

मैं opencv, अजगर का उपयोग कर इस समस्या की कोशिश की। दृष्टिकोण में रंगों के आधार पर मास्किंग छवि शामिल होती है, जिसके बाद उपयुक्त आकृति मिलती है।

कोड: https://github.com/rbhambriiit/computer_vision/blob/master/find_color_boxयहाँ छवि विवरण दर्ज करें

[1 बॉक्स छूटा लेकिन मास्किंग फंक्शन को ट्यून करके आना चाहिए]

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.