2009-10-30 3 views
8

약 20000 x 20000 픽셀의 1gb 대형 tiff 이미지로 작업하고 있습니다. 무작위로 이미지에서 여러 타일 (약 300x300 픽셀)을 추출해야합니다. 효율적인 TIFF 타일 추출 C++

나는 다음과 같은 솔루션을 시도 :

  • Libtiff를 (내가 찾을 수있는 유일한 낮은 수준의 라이브러리) TIFFReadline (제공)하지만 약 19,700 unnecesary 픽셀 읽는 것을 의미한다.

  • 불필요한 픽셀을 읽지 않고 이미지에서 타일을 추출하는 독자적인 Tiff 판독기를 구현했습니다. 나는 그것이 더 빠를 것으로 예상했지만, 타일의 모든 라인에 대해 seekg를하면 매우 느려진다. 나는 또한 내 타일을 포함하는 파일의 모든 라인을 버퍼로 읽은 다음 타일을 버퍼에서 추출하려고 시도했지만 결과는 다소 차이가있다.

타일 추출 도구를 개선하는 제안을 받고 싶습니다.

모든 어쩌면 당신이 등 내가 사용할 수있는보다 효율적인 도서관, 내 요구에 대한 C/C++ I/O, 일부 높은 수준의 전략에 대한 몇 가지 팁을 제안 할 수있다, 환영

감사합니다, 후안

+0

압축되지 않은 것으로 가정 할 수 있습니까? –

+0

데이터가 스캔 라인으로 정리되어 있습니까? –

+0

네, 데이터는 가장 traditinal 방법으로 압축하고 구성되어 있습니다 1 호선 2 호선 세 번째 줄 ... – Juan

답변

2
+0

현재이 옵션을 테스트 중입니다. 답장을 보내 주셔서 감사합니다. – Juan

+0

64 비트 운영 체제에 흥미 롭습니다. 대형 tiff 파일은 쉽게 32 비트 경계를지나갑니다. 내 XP에서 400MByte 이상의 비트 맵을 읽는 데 문제가 있습니다. 왜냐하면 '가상 메모리'조각화 때문입니다. 즉 : 2GB 무료 (!) RAM이 있더라도 400MB의 연속 메모리 공간을 찾을 수 없습니다. – Adriaan

3

[주요 편집 1월 14일 10] 나는 타일의 당신의 언급에 의해 혼란 조금 티파니가 바둑판 식으로 배열되지 않는 한

.

나는 타일/피라미드 형 TIFF 이미지를 사용합니다.

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

당신은 타일 크기를 실험 할 수 있습니다 : 나는 당신이 할 수 있다고 생각 VIPS

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

있는 사람을 만들었습니다. 그런 다음 TIFFReadEncodedTile을 사용하여 읽을 수 있습니다.

피라미드 티프를 사용하는 다중 해상도 저장은 확대/축소가 필요한 경우 훨씬 빠릅니다. 이 이미지를 사용하여 거친 이미지를 거의 바로 뒤에 상세한 이미지로 표시 할 수도 있습니다.

(적절한 크기의) 타일링 된 스토리지로 전환하면 (임의 액세스에 대한 성능이 크게 향상됩니다!) 병목 현상은 디스크 io가됩니다. 순서대로 읽으면 파일 읽기가 훨씬 빠릅니다. 여기에 mmapping이 해결책이 될 수 있습니다.

몇 가지 유용한 링크 :

VIPS IIPImage LibTiff.NET stackoverflow VIPS는 읽기/쓰기보다 훨씬 더 많은 일을 할 수있는 이미지 처리 라이브러리입니다. 자체 고유의 매우 효율적인 내부 형식이 있습니다. 그것은 알고리즘에 대한 좋은 문서를 가지고있다. 하나는 파일 시스템에서 처리를 분리하여 타일을 캐시 할 수있게합니다.

IIPImage는 다중 줌 웹 서버/브라우저 라이브러리입니다.문서가 다중 해상도 이미징 (Google지도와 같은)에 대한 아주 좋은 정보원임을 알게되었습니다.

이 페이지의 다른 해결책은 mmap을 사용하여 '작은'파일에만 효율적입니다. 나는 종종 32 비트 경계를 쳤다. 일반적으로 하나 또는 두 개의 응용 프로그램을 실행 한 후에 가상 메모리조차도 조각화되기 때문에 1GB짜리 메모리 할당은 32 비트 OS에서 (4GB RAM이 설치된 상태에서) 실패합니다. 여전히 이미지의 일부 또는 전체를 캐시하기에 충분한 메모리가 있습니다. 더 많은 메모리 = 더 많은 성능.

+0

TIFF는 타일링되거나 데이터 스트립이있을 수 있습니다. 이것은 큰 이미지의 생성과 읽기를 관리하는 유일한 방법입니다. – WhoCares

0

임의로 큰 TARGA (TGA) 형식 파일을 처리하기 위해 이와 비슷한 작업을 수행했습니다. 파일의 종류가 단순한 것은 이미지가 압축되어 있지 않다는 것입니다. 이미지 내의 임의의 픽셀 위치를 계산하고 간단한 탐색으로 찾을 수 있습니다. 이미지 인코딩을 지정할 수있는 옵션이있는 경우 targa 형식을 고려할 수 있습니다.

TIFF 형식에는 여러 가지가 있습니다. 그들이 이미 모든 다른 형식을 지원하는 고통을 겪었 으면 아마 라이브러리를 사용하고 싶을 것입니다.

2

답장을 보내 주셔서 감사합니다.

실제로 타일을 바꿔야하는 방식이 변경되어 임의의 방법 대신 하드 디스크의 파일에서 순차적으로 타일을 추출 할 수있었습니다. 이렇게하면 파일의 일부를 RAM에로드하고 거기에서 타일을 추출 할 수있었습니다.

효율성 증가가 컸습니다. 그렇지 않으면 파일에 임의 접근이 필요한 경우 mmap을 사용하는 것이 좋습니다.

안부, 후안

-1

는 특정 오류 메시지가 표시됩니까? 어떻게 명령 행을 사용했는지에 따라, 당신은 당신 자신의 파일을 밟을 수있었습니다.

문제가 아니라면 옵션 인 경우 vips 대신 imagemagick을 사용해보세요.

관련 문제