2009-06-22 15 views
10

मैं जो MATLAB छवि प्रसंस्करण उपकरण बॉक्स का गहन उपयोग करता MATLAB में एक छवि प्रसंस्करण कार्यक्रम, विशेष रूप से रूपात्मक संचालन (imopen, imclose) और साथ ही imadjust लिखा है। हम बहुत सारे स्पलाइन फिट ऑपरेशंस और मेडफिल्टर 2 और मेडफिल्ल्ट 1 बहुत कुछ करते हैं।मैं MATLAB छवि प्रसंस्करण प्रोग्राम जावा में कैसे परिवर्तित करूं?

हम जो हमें जावा के लिए इस कार्यक्रम कन्वर्ट करने के लिए चाहता है एक ग्राहक है। मैं जावा छवि प्रसंस्करण लाइब्रेरी का एक विस्तृत विवरण सुनना चाहता हूं जो छवि प्रसंस्करण और splines में MATLAB की कार्यक्षमता को डुप्लिकेट कर सकता है, विशेष रूप से इंटरफ़ेस MATLAB के साथ तुलना करता है।

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

इसके अलावा, यह MATLAB और जावा के बीच परिवर्तित करने में किसी भी सामान्य gotchas के सीखने के लिए बहुत अच्छा होगा।


संपादित करें: हमारे ऐप्लिकेशन एक अपेक्षाकृत सरल वस्तु की वर्तमान खंडों छवियों। यह:

1. Starts with a 3D matrix of gray scale image slices representing a single area 
2. Does a medfilt1 to even out each slice. 
3. Does some imopen, imclose and imadjust operations on the image to remove some fuzziness, 
4. Does some simple thresholding in various areas to find boundary points 
5. Fits splines to the boundary points, 
6. Uses the 3rd dimension in various ways to further perfect the point matching, especially using medfilt2. 
7. Saves each slice with the boundary splines written in color on it. 

मैं नोट करना चाहिए कि हम क्या कर रहे हैं "पट्टी फिटिंग" बल्कि पट्टी मिलान के मुकाबले - तख़्ता फिटिंग समुद्री मील की एक निश्चित संख्या के साथ एक कम से कम वर्ग मैच है - पट्टी मिलान अंक वास्तव में एक मनमाना के साथ मेल खाता है नॉट्स की संख्या। मैं अधिक सरल स्पलीन कार्यों से स्पलीन मिलान को कार्यान्वित नहीं करना चाहता हूं।

MATLAB के बिल्डर जावेद एक विकल्प है लेकिन मैं यह भी पता है कि शुद्ध जावा में उपलब्ध है और साथ ही पता है भूमि के ऊपर बिल्डर जावेद किस तरह शामिल करना चाहते हैं।


संपादित करें 2:

ध्यान दें कि हम रीढ़ फिटिंग कर रहे हैं - एक तरीके के रूप पट्टी करने के लिए एक भी बिंदु के फिट का उपयोग कर कि क्या यह खत्म करने के लिए तय करने के लिए - के बाद से डेटा गंदा है, हम एक बहु कदम बिंदु उन्मूलन प्रक्रिया है, इसलिए splines एक अभिन्न एल्गोरिथ्म का हिस्सा हैं। और हां, तो बाद से मैं बिल्कुल नहीं जय में splines का कोई उल्लेख पा सकते हैं, इसलिए यदि किसी को भी एक जावा पुस्तकालय की पेशकश कम से कम वर्ग पट्टी फिटिंग जानता है, कि अद्भुत होगा।


संपादित 2.5: हम समुद्री मील की एक निश्चित संख्या (0-5 समुद्री मील) के साथ splines का उपयोग अंक का एक सेट के कम से कम वर्ग सन्निकटन का उपयोग कर रहे हैं। अगर हमें इसे फिर से कार्यान्वित करना है, तो चीजें पागल हो जाएंगी, क्योंकि अभी हम इसके लिए MATLAB योगदान लाइब्रेरी का उपयोग कर रहे हैं।

और हम निश्चित रूप से एल्गोरिथ्म फिर से नहीं करना चाहती। यह काम करने में काफी मुश्किल था ...

+0

यह ध्वनि किनारे की खोज की तरह है। क्या आपको स्पिनलाइन पॉइंट आउटपुट या केवल हाइलाइट की गई छवियों की सीमाओं की आवश्यकता है? – Clint

उत्तर

9

जावा कोड के लिए Matlab कोड में परिवर्तित करने के बारे में कई सामान्य नुकसान कर रहे हैं। मैंने मैटलैब को सी ++ कोड में परिवर्तित कर दिया है, इसलिए मेरी सलाह उन अनुभवों से आती है।

  1. आप मैटलैब में छोरों के लिए उपयोग कर रहे हैं, सामान्य रूप में, आप गलत कर रहे हैं। Matrices (छवियों, आदि) जोड़ना काफी सरल है:

    ए = बी + सी;

    छवि के आकार से कोई फर्क नहीं पड़ता। फ़िल्टरिंग भी काफी सरल कॉल है:

    ए = imfilter ('median', b); # या ऐसा कुछ, मैं इस समय मेरी मैटलैब मशीन के सामने नहीं हूं।

    इसी प्रकार के समारोह कॉल जय (जावा उन्नत इमेजिंग) में मौजूद हैं, इसलिए यदि आप उन्हें मिल सकता है देखते हैं। मैं अपने मंझला छानने आवश्यकताओं की बारीकियों पता नहीं है (मैं मान medfilt1 एक 3x3 स्थानीय मंझला गिरी को छानने, बल्कि आंकड़ों पर एक -1 डी छानने गिरी रन से करने के लिए है क्योंकि इसका मतलब यह होगा कि आप केवल एक में फ़िल्टर कर रहे हैं दिशा), तो क्या the documentation. में है पर एक नज़र डालें लेकिन, अगर आप अपने खुद के बारे में, इसके बाद के संस्करण अतिरिक्त के रूप में आसान हो सकता है के रूप में एक पाश, या एक जटिल वर्ग ऐसा

    MyMatrix एक = कुछ को लागू करता है के लिए दोगुना-नेस्ट MyMatrix.Add (बी, सी);

    मेरे बिंदु, है मैटलैब की सादगी सभी डिजाइन फैसले आप इस एक कुशल जावा कार्यक्रम बनाने के लिए बनाने की जरूरत है अस्पष्ट कर सकते हैं।

  2. याद रखें, जब आप लूप, मैटलैब और जावा के लिए करते हैं तो पंक्ति/कॉलम ऑर्डर रिवर्स होता है। Matlab स्तंभ-प्रमुख है, और जावा row-major है। उस परिवर्तन को ध्यान में रखने के लिए आपको अपने लूप को फिर से लिखना होगा, या फिर आपका कोड धीमा हो जाएगा।

  3. व्यक्तिगत रूप से, मैं विशिष्ट संचालन को छोड़कर जेएआई से बचने की कोशिश करता हूं जिसे मुझे पूरा करने की आवश्यकता है। उदाहरण के लिए, केवल मध्य फ़िल्टरिंग परिचालनों के लिए इसका उपयोग करें और आगे। मैं इसे ऑप्टिमाइज़ेशन के रूप में उपयोग करने पर विचार करता हूं, लेकिन ऐसा इसलिए है क्योंकि मैं ओल्ड स्कूल हूं और पहले अपना खुद का इमेज प्रोसेसिंग ऑपरेशंस लिखता हूं। यदि आप उस दृष्टिकोण को लेते हैं, तो आप अपना कोड वही लिख सकते हैं जो आप चाहते हैं, और फिर आप जेएआई कॉल में जोड़ सकते हैं और यह सुनिश्चित कर सकते हैं कि आउटपुट आपके कोड से पहले से मेल खाता है। सीए ++ में जेएआई या इंटेल आईपीपी जैसे उन्नत पुस्तकालयों का उपयोग करने में समस्या यह है कि बहुत सारे लाइब्रेरी-विशिष्ट गॉथैस (जैसे टाइलिंग, या प्रत्येक पंक्ति को अंत में कुछ अतिरिक्त पिक्सेल के साथ बिटमैप की तरह आवंटित किया गया है या नहीं, या ऐसे अन्य विवरण), और आप उन समस्याओं से निपटना नहीं चाहते हैं जबकि एक ही समय में अपना कोड आगे बढ़ाना है। जय तेज है, लेकिन यह एक जादू बुलेट नहीं है; यदि आप नहीं जानते कि इसका उपयोग कैसे किया जाए, तो यह सुनिश्चित करने के लिए बेहतर है कि आपके पास कुछ तेज़ होने से पहले कुछ मिल गया है।

  4. यदि मैं लाइनों के बीच थोड़ा सा पढ़ सकता हूं, ऐसा लगता है कि आप चिकित्सा इमेजिंग डेटा पर किसी प्रकार का विभाजन कर रहे हैं। मुझे नहीं पता कि जावा पुस्तकालयों में डीआईसीओएम छवियों में पढ़ने के लिए क्या हैं, लेकिन जीडीसीएम सी ++ और सी # के लिए अच्छी तरह से काम करता है, और इसमें जावा रैपर भी हैं। Matlab छवि हैंडलिंग, विशेष रूप से DICOM छवि हैंडलिंग की आसानी को अस्पष्ट करता है, ताकि आप छवि फ़ाइल मैनिपुलेशन को संभालने के लिए स्वयं को कुछ DICOM लाइब्रेरी सीख सकें। मैंने पिछले कुछ वर्षों में डीआईसीओएम मानक का एक छोटा सा अंश सीखा है; specification बेहद पूर्ण है, शायद अधिकतर, लेकिन आप यह समझ सकते हैं कि आपको विस्तार से विस्तार करने के लिए क्या करना है। यदि आप चिकित्सा डेटा के सेगमेंटेशन करने की कोशिश कर रहे हैं, तो डेटा पर स्पलीन को सहेजना सही नहीं है ताकि आपकी छवियां अन्य डीआईसीओएम पाठकों के साथ काम कर सकें। Contours निर्दिष्ट तरीके से एक नज़र डालें। अधिक जानकारी के लिए प्रतिक्रिया में

संपादित करें:

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

इसके बजाय, मैं स्पिनलाइन फिटिंग पर कोड के लिए संख्यात्मक व्यंजनों, विशेष रूप से Chapter 3 देखेंगे। कोड एक आधारित है, शून्य आधारित नहीं है, इसलिए इसे कुछ अनुवाद की आवश्यकता है, लेकिन यह पूरी तरह से करने योग्य है।

यदि आप सीमा से शोर बिंदुओं को निकालने का प्रयास कर रहे हैं, तो आप उन किनारों को धुंधला करने का प्रयास भी कर सकते हैं जिन्हें आप मूल रूप से अपने अंक प्राप्त कर रहे हैं। स्पिनलाइन फिटिंग को जानने के बिना आप ऐसा करने की कोशिश कर रहे हैं (कई भिन्नताएं हैं), किसी अन्य भाषा में सटीक समकक्ष की सिफारिश करना मुश्किल होगा।

संपादित करें 2.5: यदि योगदान लाइब्रेरी से स्पलीन फिट करने के द्वारा, क्या आपका मतलब this code जैसा है? यदि सबसे बुरी स्थिति सबसे खराब होती है, तो आपके पास कम से कम स्रोत कोड होगा। यदि आप ऐसा कुछ करने के लिए खत्म कर देते हैं, तो एक और बहुत उपयोगी युक्ति यह है कि मैटलैब सभी युगल है, और कुछ भी नहीं जब तक कि आप इसे मजबूर नहीं करते (और फिर भी, बहुत से ऑपरेशन गैर-युगल पर काम नहीं करते हैं)। इसलिए, उचित समझौते को बनाए रखने के लिए, आपको अपने कोड को युगल में भी करना होगा। मैं कई परीक्षण भी करूंगा। यदि आप उस कोड (या ऐसा कुछ) लिखते हैं, तो ज्ञात इनपुट और अपेक्षित आउटपुट का समूह (त्रुटि के कुछ उचित मार्जिन के भीतर, जहां आपको परिभाषित करना होगा कि 'उचित' साधन क्या है) यह सुनिश्चित करने में महत्वपूर्ण होगा कि जिस पहिये की आप प्रतिलिपि बना रहे हैं (वास्तव में पुनर्निर्मित नहीं) मूल रूप से प्रति दूरी एक ही घूर्णन है। आखिरी वाक्य में शायद बहुत सारे पैरांटिक अभिव्यक्तियां हैं।

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

+0

धन्यवाद, ऊपर मेरी टिप्पणियां देखें ... –

0

मुझे विश्वास है कि Raster.getPixels और WritableRaster.setPixels आपके द्वारा बात की जा रही पिक्सेल डेटा संशोधन की अनुमति देता है।

मैं, नाटक करने के लिए हालांकि यह बंदरगाह सरल हो जाएगा नहीं जा रहा हूँ।

+0

लेकिन इसके बारे में क्या आसान नहीं होगा? –

+0

किसी ने इस जवाब को वोट देना होगा। क्यों, यह पूरी तरह उपयोगी है –

2
स्पष्ट मैटलैब सवाल आप ImageJ पर गौर करना चाहिए को संबोधित बिना

।यह छवि विश्लेषण और हेरफेर के लिए कई योगदान प्लगइन के साथ एक ओपन सोर्स जावा एप्लिकेशन है। मध्यस्थ फ़िल्टरिंग

मैटलैब को जावा में कनवर्ट करने के साथ सबसे बड़ी समस्या यह है कि आप मैटलैब में एक पंक्ति वाले कार्यों को संभालने के लिए कई लूप लिखेंगे।

यदि आप अपने स्पिनलाइन परिचालनों को अधिक विस्तार से वर्णित कर सकते हैं तो मैं आपको अधिकतर छविजे ऑपरेशंस की आवश्यकता के बारे में जानकारी प्राप्त कर सकता हूं। http://www.mste.uiuc.edu/exner/java.f/leastsquares/

+0

शायद इस लिंक में मोफोलॉजिकल ऑपरेशन कहां से एक लिंक है। प्रवेश लिंक से, मैं यह नहीं बता सकता कि इसकी लाइब्रेरी या एप्लिकेशन –

+0

यह एक एप्लिकेशन है। ImageJ के प्लगइन के रूप में अपने एप्लिकेशन के मूल को लिखना बुरा विचार नहीं है, और फिर कोर कोड को काम करने के बाद आपके कोड के सभी छवि-हैंडलिंग भाग लिखना चाहिए। – mmr

0

आम तौर पर, इमेज प्रोसेसिंग संचालन समय लेने वाली हैं, इसलिए वे अक्सर सी में लागू किया जाता है या सी ++ गति के लिए, तो यह आश्चर्य की बात है कि आप कर रहे हैं नहीं है: पट्टी जावा में फिटिंग के

उदाहरण आपको जो चाहिए उसे जावा कोड ढूंढने में परेशानी। आप उनमें से कम से कम कुछ के लिए खुद को रोल करने के अंत हो सकता है। आपके द्वारा उल्लिखित ऑपरेशंस जैसे मॉर्फोलॉजी या मेडियन फ़िल्टर अच्छी तरह से प्रलेखित हैं और कार्यान्वित करने के लिए काफी सरल हैं, खासकर जब आपके पास मैटलैब फ़ंक्शन देखने और परीक्षण करने के लिए होते हैं।

+0

असल में पिक्सस्टिक एक जावास्क्रिप्ट है जो जावा लाइब्रेरी नहीं है – jitter

+0

ओह ... मैंने कहा कि यह _quick_ google खोज था। – Dima

4

मैथब्लॉक्स द्वारा प्रदान किए गए MATLAB Builder JA का उपयोग करने के बारे में, जो MATLAB के डेवलपर हैं।

+0

इस पर केवल दोष यह है कि इसे मैटलैब रनटाइम की आवश्यकता होती है, जो स्वतंत्र रूप से वितरित करने योग्य है लेकिन काफी बड़ा (130 एमबी) –

+0

@jitter, MATLAB बिल्डर जेए की लागत कितनी है? क्या आप किसी भी अन्य मैटलैब के बारे में जावा रैपर को जानते हैं जो फ्रीवेयर हैं ?? धन्यवाद! – Gevorg

1

बस यह नहीं करें this way। मै मैट्रिक्स ऑपरेशंस को लागू करने के लिए वीका का उपयोग करने के लिए आपको क्या सलाह देता हूं, यह जानने की सलाह देने जा रहा था (मैंने इसका कभी भी उपयोग नहीं किया है) लेकिन मुझे लगता है कि यह इसके लिए दूसरी लाइब्रेरी का उपयोग नहीं कर सकता है। यहां तक ​​कि अगर ऐसा होता है, तो यह matlab की तरह नहीं हो सकता है, न ही छवियों का समर्थन कर सकता है।

1

आप इसे MATLAB स्क्रिप्ट को स्वतंत्र रूप से चलाने के लिए संकलित कर सकते हैं। यह सभी मामलों में काम नहीं करता है लेकिन यदि ऐसा होता है, तो आप अकेले अपना तेज़ MATLAB कोड छोड़ सकते हैं और जावा प्रोसेसर को जावा से कॉल करने का प्रयास कर सकते हैं।

http://www.mathworks.com/products/compiler/

3

जब मैंने पिछले में जावा कोड में MATLAB कोड परिवर्तित कर दिया है तो मुझे CERN COLT लाइब्रेरी बहुत उपयोगी मिली है। वे आपकी छवि प्रसंस्करण नहीं करेंगे, लेकिन उन्होंने मैट्रिक्स गणित कोड को बहुत तेज़ी से परिवर्तित करके मुझे बहुत समय बचाया है।