एक प्लांट माइक्रोस्कोपी छवि में रंध्र का पता लगाएं


26

यहाँ इमेज प्रोसेसिंग विशेषज्ञों के लिए एक प्रश्न है।

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

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

  • बनावट क्लासीफायर
    • DCT (असतत कोसाइन रूपांतरण / आवृत्ति-डोमेन विश्लेषण)
    • LBP (स्थानीय बाइनरी पैटर्न)
  • HOG (उन्मुख ग्रेडिएंट का हिस्टोग्राम)
  • मजबूत फीचर डिटेक्टर (मुझे संदेह है)
    • हैरिस कोने
    • SIFT, SURF, STAR, आदि।
  • Haar कैस्केड क्लासिफायर / वियोला-जोन्स सुविधाएँ

और संभवतः एक उपन्यास फीचर डिस्क्रिप्टर डिज़ाइन करें। मैं अभी के लिए एक क्लासिफायर का चयन छोड़ रहा हूं।

मुझे क्या याद किया? आप इसे कैसे हल करेंगे? समान ऑब्जेक्ट डिटेक्शन समस्याओं के लिए समाधान बहुत उपयोगी होगा।

नमूना छवियों यहाँ

रंध्र

बैंडपास फिल्टर के बाद: बैंडपास फ़िल्टर किया गया

कैनी किनारे का पता लगाने का वादा नहीं है। कुछ छवि क्षेत्र ध्यान से बाहर हैं: कैनी बढ़त का पता लगाने


1
हो सकता है कि आप रंध्र खोजने की कोशिश करने के बजाय, आप आलसी लाइनों को हटाने की कोशिश कर सकें?
एंडोलिथ

1
आपको कितनी छवियों को संसाधित करना है? कितनी तेजी से होने की आवश्यकता है? इसे कितना स्वचालित होना चाहिए?
एंडोलिथ

1
इसे बहुत तेज नहीं होना है। हम 1000 छवियों के आदेश पर प्रसंस्करण कर रहे हैं। यह एक निर्देशिका में स्वचालित - डंप छवियों को रखना चाहिए और जाना चाहिए।
मैट एम।

जवाबों:


15

क्षमा करें, मुझे OpenCV का पता नहीं है, और यह पूर्ण उत्तर की तुलना में एक पूर्व-प्रसंस्करण कदम है:

सबसे पहले, आप एक किनारे डिटेक्टर नहीं चाहते हैं। एक एज डिटेक्टर ट्रांज़िशन को परिवर्तित करता है (जैसे डार्क-टू-लाइट):

    _____ / ~~~~~

लकीरें (अंधेरे पर उज्ज्वल रेखाएं) इस तरह से हैं:

    ____ / _____

यह एक भेदभाव करता है, दूसरे शब्दों में।

लेकिन आपकी छवियों में, एक दिशा से एक प्रकाश चमक रहा है, जो हमें 3 डी सतह की राहत दिखाता है। हम इसे लाइनों और किनारों के रूप में देखते हैं, क्योंकि हम 3 डी में चीजों को देखने के लिए उपयोग किए जाते हैं, लेकिन वे वास्तव में नहीं हैं, यही कारण है कि एज डिटेक्टर काम नहीं कर रहे हैं, और टेम्पलेट मिलान घुमाए गए चित्रों के साथ आसानी से काम नहीं करेगा (एक आदर्श 0 डिग्री रोटेशन पर मैच वास्तव में 180 डिग्री पर पूरी तरह से रद्द हो जाएगा, क्योंकि प्रकाश और अंधेरे एक-दूसरे के साथ पंक्तिबद्ध होंगे)।

यदि इन में से किसी एक की ऊँचाई रेखाओं की तरह दिखती है:

    ____ / _____

तब चमक समारोह जब एक तरफ से रोशन इस तरह दिखेगा:

    ____ ∧v ____

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

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

मूल, घुमाया हुआ

आपको छवि में सभी कम-आवृत्ति परिवर्तनों को हटाने की भी आवश्यकता है, हालांकि, केवल जल्दी-बदलते लाइन जैसी सुविधाओं को उजागर करने के लिए। रिंगिंग कलाकृतियों से बचने के लिए, मैंने 2D गौसियन कलंक का उपयोग किया और फिर मूल से घटाया:

उच्च पास फ़िल्टर किया गया

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

उत्पादन

अब रंध्र चारों ओर से सफ़ेद अंडाकार होते हैं, कुछ स्थानों पर सफ़ेद के बजाय और दूसरों में काले रंग के।

मूल:

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

को एकीकृत:

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

from pylab import *
import Image
from scipy.ndimage import gaussian_filter, gaussian_filter1d

filename = 'rotated_sample.jpg'
I = Image.open(filename).convert('L')
I = asarray(I)

# Remove DC offset
I = I - average(I)

close('all')
figure()
imshow(I)
gray()
show()
title('Original')

# Remove slowly-varying features
sigma_2d = 2
I = I - gaussian_filter(I, sigma_2d)

figure()
imshow(I)
title('2D filtered with %s' % sigma_2d)

# Integrate
summed = cumsum(I, 1)

# Remove slowly-changing streaks in horizontal direction
sigma_1d = 5
output = summed - gaussian_filter1d(summed, sigma_1d, axis=1)

figure()
imshow(output)
title('1D filtered with %s' % sigma_1d)

Hough को बदलने , इस, "बढ़त पिक्सल" से बने तरह रिज दीर्घवृत्त पता लगाने के लिए हालांकि यह वास्तव में गणना और स्मृति में महंगा है इस्तेमाल किया जा सकता है, और वे सही दीर्घवृत्त तो यह एक "लापरवाही" डिटेक्टर का एक सा होना चाहिए था नहीं हैं। मैंने इसे कभी नहीं किया है, लेकिन " हूप इलिप्स डिटेक्शन " के लिए बहुत सारे Google परिणाम हैं । मैं कहूंगा कि यदि आप एक निश्चित आकार के खोज स्थान के भीतर दूसरे के अंदर एक दीर्घवृत्त का पता लगाते हैं, तो इसे एक रंध्र के रूप में गिना जाना चाहिए।

और देखें:


PS क्या मैंने यहाँ क्या किया एक नाम है? क्या यह एक सामान्य फिल्टर प्रकार है?
एंडोलिथ

1
+1 - शानदार जवाब! प्रकाश स्रोत कोण के स्वचालन के बारे में - आप बढ़त डिटेक्टर का उपयोग कर सकते हैं जो दोनों परिमाण और ढाल की गणना करता है और फिर ढाल के वजन (पत्रिका द्वारा) की गणना करता है। सबसे मजबूत प्रतिक्रियाएं रोशनी की दिशा में होनी चाहिए।
एंड्री रुबेश्टिन

11

पहली चीज़ जो मैं कोशिश करूँगा वह है टेम्पलेट मिलान, कुछ चरणों के साथ सभी कोणों के लिए घुमाए गए टेम्पलेट्स के साथ। यहाँ आवश्यक टेम्पलेट घूर्णन। इसके अलावा टेम्पलेट का विकल्प गैर-तुच्छ हो सकता है - विभिन्न प्रकाश व्यवस्था के साथ कई हो सकते हैं, और यह आकृतियों में अंतर की अनुमति देने के लिए धुंधला हो सकता है।

http://en.wikipedia.org/wiki/Template_matching#Template-based_matching_and_convolution

अगला - HOG यहां आशाजनक लग रहा है। एक अन्य समाधान मोरेवेक या शी-तोमासी (गैर-अधिकतम दमन के साथ) जैसे मजबूत कोने डिटेक्टर का उपयोग किया जा सकता है और उम्मीदवारों के रूप में एक ही पंक्ति पर 2-कोनों या 3-4 कोनों के समूहों की तलाश कर सकते हैं। उम्मीदवारों को खोजने के बाद आप सत्यापन के लिए सक्रिय समोच्च लागू कर सकते हैं (यह सुनिश्चित नहीं है कि यह वास्तव में मदद करेगा, लेकिन यह संभावना है)

http://en.wikipedia.org/wiki/Corner_detector

http://en.wikipedia.org/wiki/Active_contour

फिर भी एक और संभावना है कि एलिप्स के लिए पर्याप्त रूप से ट्रांसफ़ॉर्म का उपयोग किया जाए, संभवतः 2 नहीं बल्कि 3-4 मुक्त मापदंडों के साथ।


7

आंशिक उत्तर गणितज्ञों के साथ उम्मीदवार खोजना:

p = ColorConvert[Import@"http://i.stack.imgur.com/38Ysw.jpg", 
    "GrayScale"] // ImageAdjust;
m = DeleteSmallComponents[Erosion[Dilation[DeleteSmallComponents[
      Binarize[EntropyFilter[p, 1] // ImageAdjust, .97], 10], 3], 5], 100];
ImageMultiply[Dilation[m, 3], p]

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


दिलचस्प परिणाम ... शायद किसी अन्य योजना के साथ गठबंधन ...
मैट एम।

@ कम हां मुझे लगता है कि गैर-लक्षित सतह के कम से कम 80% को त्याग दिया। मास्क को थोड़ा पतला करने के बाद, आपको दीर्घवृत्त की खोज करनी चाहिए। चाहे आप जिस भी तरीके का उपयोग करें (मैं अभी भी सोच रहा हूं कि मैं क्या कर सकता था) अब यह बहुत आसान है अब आप जानते हैं कि जानवर घिरे हुए हैं।
डॉ। बेलीज़ेरियस

1

मैं एक संवेदनशील एज डिटेक्टर (उदाहरण के लिए एक कम सीमा के साथ ढाल परिमाण) का उपयोग करके शुरू करूँगा, और फिर दीर्घवृत्त का उपयोग करके दीर्घवृत्त खोजने की कोशिश करूंगा। कैनी अभी भी काम कर सकता है। मुझे यकीन है कि ऐसे पैरामीटर हैं जो आप इसे अधिक संवेदनशील बनाने के लिए और धुंधले किनारों को उठा सकते हैं।

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