2009-10-30 18 views
8

मैं लगभग 20000 x 20000 पिक्सल की 1 जीबी बड़ी टिफ छवियों के साथ काम कर रहा हूं। मुझे यादृच्छिक स्थितियों में छवियों में से कई टाइल्स (लगभग 300x300 पिक्सल) निकालने की आवश्यकता है।कुशल टीआईएफएफ टाइल निष्कर्षण सी ++

मैं निम्नलिखित समाधान की कोशिश की:

  • Libtiff (केवल निम्न स्तर पुस्तकालय मैं मिल सकता है) TIFFReadline (प्रदान करता है), लेकिन यह है कि चारों ओर 19700 अनावश्यक पिक्सल में पढ़ने का मतलब है।

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

मैं उन सुझावों को प्राप्त करना चाहता हूं जो मेरे टाइल निष्कर्षण उपकरण को बेहतर बनाएंगे!

सब कुछ का स्वागत है, हो सकता है आप एक अधिक कुशल पुस्तकालय मैं इस्तेमाल कर सकते हैं, C/C++ मैं/हे, कुछ उच्च स्तर मेरी जरूरतों के लिए रणनीति के बारे में कुछ सुझाव दिए गए, आदि का प्रस्ताव कर सकते

सादर, जुआन

+0

क्या हम मान सकते हैं कि वे असम्पीडित हैं? –

+0

और यह डेटा स्कैनलाइन में व्यवस्थित है? –

+0

हाँ, डेटा असम्पीडित और सबसे traditinal तरह से आयोजित किया जाता है: पंक्ति 1 line2 पंक्ति 3 ... – Juan

उत्तर

2

बस अपनी फ़ाइल को याद करें।

http://www.kernel.org/doc/man-pages/online/pages/man2/mmap.2.html

+0

मैं वर्तमान में इस विकल्प का परीक्षण कर रहा हूं। आपके जवाब के लिए धन्यवाद। – Juan

+0

64 बिट ऑपरेटिंग सिस्टम पर दिलचस्प है। बड़ी टिफ फाइलें 32-बिट सीमाओं से आसानी से जाती हैं। मेरे एक्सपी पर मुझे 400 एमबीटीई और ऊपर के बिटमैप्स पढ़ने में समस्याएं हैं, क्योंकि 'वर्चुअल मेमोरी' विखंडन। यही है: मुझे 2 मेगाइट फ्री (!) रैम के साथ भी लगातार मेमोरी स्पेस का 400 एमबीटीटी हिस्सा नहीं मिल रहा है। – Adriaan

3

[मेजर संपादित करें 14 जनवरी 10]

मैं गया था एक सा टाइल्स के अपने उल्लेख से उलझन में जब टिफ टाइलों नहीं है।

मैं टाइल/पिरामिडिकल टीआईएफएफ छवियों का उपयोग करता हूं। मैं VIPS

vips im_vips2tiff source_image output_image.tif:none,tile:256x256,pyramid 

साथ उन लोगों के द्वारा बनाए गए मुझे लगता है कि आप के साथ ऐसा कर सकते हैं:

vips im_vips2tiff source_image output_image.tif:none,tile:256x256,flat 

आप टाइल आकार के साथ प्रयोग कर सकते हैं। फिर आप TIFFReadEncodedTile का उपयोग करके पढ़ सकते हैं।

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

स्विच करने के बाद (उचित आकार) टाइल किए गए स्टोरेज (जो आपको यादृच्छिक पहुंच के लिए प्रमुख प्रदर्शन सुधार लाएगा!), आपकी बाधा डिस्क io होगी। अनुक्रम में पढ़ने पर फ़ाइल पढ़ने बहुत तेज है। यहां mmapping समाधान हो सकता है।

कुछ उपयोगी लिंक्स:

VIPS IIPImage LibTiff.NET stackoverflow VIPS एक छवि से निपटने पुस्तकालय जो ज्यादा से ज्यादा सिर्फ पढ़ने/लिखने कर सकते हैं। इसका अपना, बहुत ही कुशल आंतरिक प्रारूप है। यह एल्गोरिदम पर एक अच्छा प्रलेखन है। एक के लिए, यह फाइल सिस्टम से प्रसंस्करण decouples, जिससे टाइल्स को कैश किया जा सकता है।

आईआईपीआईमेज एक बहु-ज़ूम वेबसर्वर/ब्राउज़र लाइब्रेरी है।मैंने प्रलेखन को बहु-रिज़ॉल्यूशन इमेजिंग (जैसे Google मानचित्र) पर जानकारी का एक बहुत अच्छा स्रोत पाया है

mmap का उपयोग करके इस पृष्ठ पर अन्य समाधान केवल 'छोटी' फ़ाइलों के लिए कुशल है। मैंने 32-बिट सीमाओं को अक्सर मारा है। आम तौर पर, स्मृति के 1 जीबीटीटी खंड को आवंटित करने से 32-बिट ओएस (4 जीबीइट्स रैम स्थापित किया जाता है) पर असफल हो जाता है क्योंकि इस तथ्य के कारण वर्चुअल मेमोरी भी एक या दो एप्लिकेशन रन के बाद फंस जाती है। फिर भी, भागों या पूरे चित्र को कैश करने के लिए पर्याप्त स्मृति है। अधिक स्मृति = अधिक प्रदर्शन।

+0

टीआईएफएफ को टाइल किया जा सकता है या डेटा की स्ट्रिप्स हो सकती है। बड़ी छवियों के निर्माण और पढ़ने का प्रबंधन करने का यही एकमात्र तरीका है। – WhoCares

0

मैंने मनमाने ढंग से बड़ी तारागा (टीजीए) प्रारूप फ़ाइल को संभालने के लिए ऐसा कुछ किया। जिस चीज ने इसे इस तरह की फ़ाइल के लिए सरल बना दिया है वह यह है कि छवि संपीड़ित नहीं है। आप छवि के भीतर किसी भी मनमाने ढंग से पिक्सेल की स्थिति की गणना कर सकते हैं और इसे सरल खोज के साथ ढूंढ सकते हैं। यदि आपके पास छवि एन्कोडिंग निर्दिष्ट करने का विकल्प है तो आप तर्गा प्रारूप पर विचार कर सकते हैं।

यदि टीआईएफएफ प्रारूपों की कई किस्में नहीं हैं। यदि आप पहले से ही सभी अलग-अलग प्रारूपों का समर्थन करने के दर्द से गुजर चुके हैं तो शायद आप लाइब्रेरी का उपयोग करना चाहते हैं।

2

उत्तर के लिए सभी को धन्यवाद।

असल में टाइल की आवश्यकता के तरीके में एक बदलाव, मुझे यादृच्छिक तरीके से, अनुक्रमिक तरीके से हार्ड डिस्क में फ़ाइलों से टाइल निकालने की अनुमति दी गई। इसने मुझे फ़ाइल का एक हिस्सा राम में लोड करने की अनुमति दी, और वहां से टाइल निकालें।

दक्षता लाभ बहुत बड़ा था। अन्यथा, अगर आपको किसी फ़ाइल में यादृच्छिक पहुंच की आवश्यकता है, तो mmap एक अच्छा सौदा है।

सादर, जुआन

-1

आप एक विशिष्ट त्रुटि संदेश मिला था? इस कमांड लाइन का उपयोग करने के तरीके के आधार पर, आप अपनी फ़ाइल पर कदम उठा सकते थे।

यदि यह समस्या नहीं थी, तो यह विकल्प होने पर vips के बजाय imagemagick का उपयोग करने का प्रयास करें।

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