2009-10-30 16 views
8

Pracuję z dużymi obrazami tiff o wielkości 1 gb, które mają około 20000 x 20000 pikseli. Muszę wyodrębnić kilka płytek (około 300x300 pikseli) z obrazów w losowych pozycjach.wydajna ekstrakcja kafelków TIFF C++

Próbowałem następujących rozwiązań:

  • libtiff (jedyna biblioteka niski poziom mogłem znaleźć) oferuje TIFFReadline(), ale oznacza, że ​​czytanie w około 19700 zbędnymi pikseli.

  • Zaimplementowałem własny czytnik tiff, który wyodrębnia kafelek z obrazu bez czytania niepotrzebnych pikseli. Spodziewałem się, że będzie to szybsze, ale wykonanie wyszukiwania dla każdej linii płytki powoduje, że jest bardzo powolny. Próbowałem również odczytać do bufora wszystkie wiersze pliku, które zawierają mój kafelek, a następnie wyodrębnić kafelek z bufora, ale wyniki są mniej więcej takie same.

Chciałbym otrzymywać sugestie, które poprawią moje narzędzie do wyciągania płytek!

Wszystko jest mile widziane, może można zaproponować bardziej wydajne biblioteki mogę używać, kilka wskazówek o C/C++ I/O, jakiś strategii wyższego szczebla dla moich potrzeb, itp

Pozdrawiam, Juan

+0

Czy możemy założyć, że są nieskompresowane? –

+0

A że dane są uporządkowane w liniach skanowania? –

+0

tak, nieskompresowane dane i zorganizowane w sposób najbardziej traditinal: line1 line2 line3 ... – Juan

Odpowiedz

2
+0

Aktualnie testuję tę opcję. Dzięki za odpowiedź. – Juan

+0

Interesujące w 64-bitowych systemach operacyjnych. Duże pliki tiff łatwo przekraczają granice 32-bitowe. Na moim XP mam problem z odczytywaniem bitmap o wielkości 400 MB i więcej, z powodu fragmentacji "pamięci wirtualnej". To znaczy: Nie mogę znaleźć fragmentu o wielkości 400 MB na kolejne miejsce w pamięci, nawet z 2 GB wolną (!) Pamięcią RAM. – Adriaan

3

[major edit 14 stycznia 10]

byłem nieco zdezorientowany przez wzmiankę płytek, gdy TIFF jest nie kafelki.

Używam kafelkowych/piramidowych obrazów TIFF. Utworzyłem tych z VIPS

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

myślę, że można to zrobić:

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

Możesz poeksperymentować z wielkości płytek. Następnie możesz odczytać za pomocą TIFFReadEncodedTile.

Przechowywanie w wielu rozdzielczościach przy użyciu ostrosłupowych tiffów jest znacznie szybsze, jeśli chcesz powiększyć/pomniejszyć. Możesz również użyć tego, aby mieć gruby obraz, po którym natychmiast następuje szczegółowy obraz.

Po przejściu do (odpowiedniego rozmiaru) kafelkowego magazynu (co przyniesie MASYWNE polepszenie wydajności dla dostępu losowego!), Twoim wąskim gardłem będzie dysk io. Odczyt pliku jest znacznie szybszy, jeśli czytany jest w kolejności. Tutaj rozwiązaniem może być mmapping.

Przydatne linki:

VIPS IIPImage LibTiff.NET stackoverflow VIPS jest obrazem obsługi biblioteki, które mogą zrobić dużo więcej niż tylko do odczytu/zapisu. Ma własny, bardzo wydajny format wewnętrzny. Ma dobrą dokumentację na temat algorytmów. Po pierwsze, dekomponuje przetwarzanie z systemu plików, co pozwala na buforowanie kafli.

IIPImage to serwer internetowy z wieloma zoomami i przeglądarką.Znalazłem dokumentację bardzo dobrym źródłem informacji na temat obrazowania w wielu rozdzielczościach (np. Mapy google).

Inne rozwiązanie na tej stronie, używając mmap, działa tylko w przypadku "małych" plików. Często uderzałem w granice 32-bitowe. Ogólnie przydzielanie fragmentu pamięci o wielkości 1 GB zakończy się niepowodzeniem w przypadku 32-bitowego systemu operacyjnego (z zainstalowaną pamięcią RAM 4 GB), ponieważ nawet pamięć wirtualna jest obsługiwana po jednym lub dwóch uruchomieniach aplikacji. Mimo to jest wystarczająca ilość pamięci do buforowania części lub całego obrazu. Więcej pamięci = większa wydajność.

+0

TIFF można układać w kafelki lub mieć paski danych. Jest to jedyny sposób zarządzania tworzeniem i odczytywaniem dużych obrazów. – WhoCares

0

Zrobiłem coś podobnego do tego, aby obsłużyć arbitralnie duży plik formatu TARGA (TGA). To, co stało się proste dla tego rodzaju plików, polega na tym, że obraz nie jest skompresowany. Możesz obliczyć położenie dowolnego dowolnego piksela w obrazie i znaleźć go za pomocą prostego wyszukiwania. Możesz rozważyć format targa, jeśli masz możliwość określenia kodowania obrazu.

Jeśli nie, istnieje wiele odmian formatów TIFF. Prawdopodobnie chcesz skorzystać z biblioteki, jeśli już cierpią z powodu wspierania wszystkich różnych formatów.

2

Dziękuję wszystkim za odpowiedzi.

Właściwie zmiana sposobu, w jaki płytki były wymagane, pozwoliła mi wyodrębnić kafelki z plików na dysku twardym, w sposób sekwencyjny, zamiast losowy. To pozwoliło mi załadować część pliku do pamięci RAM i wydobywać z niego kafelki.

Wzrost wydajności był ogromny. W przeciwnym razie, jeśli potrzebujesz losowego dostępu do pliku, mmap to dobra okazja.

Pozdrowienia, Juan

-1

Dostałeś konkretny komunikat o błędzie? W zależności od tego, w jaki sposób korzystałeś z tego wiersza poleceń, mógłbyś nadepnąć na swój własny plik.

Jeśli to nie był problem, spróbuj użyć imagemagick zamiast vips, jeśli jest to opcja.