2016-07-06 50 views
4

我試圖從Hamamatsu NanoZoomer幻燈片掃描儀生成的文件中提取圖像內容。 NDPI文件使用修改後的TIFF結構,並將圖像內容以JPEG格式存儲在一個大塊中。使用StripOffset和StripByteCounts,我可以提取應該是JPEG文件的數據。如何正確打開/解碼具有超過65500 * 65500像素的jpeg圖像?

數據流具有JPEG文件的所有正確簽名,例如FFD8,掃描標記的開始和FFD9,掃描標記的結束。如果這是一個小於65500 * 65500像素的圖像,那麼如果將數據流保存爲jpeg文件,則可以打開文件。

在JFIF標題中,FFC0標記之後的第三個和第四個字節表示圖像高度;之後的兩個字節表示圖像寬度。但是,對於大於65500 * 65500像素(實際上是122880 * 78848像素)的圖像,這些假定表示圖像高度和圖像寬度的四個字節全部爲零。我將它們改爲255,220,255,220,跟在this(255-263行)。當我通過在Windows中右鍵單擊來查看jpeg信息並選擇細節時,我確實看到Windows Photo Viewer將分辨率讀取爲65500 * 65500,儘管它們並不代表實際的像素分辨率。問題是,當我試圖打開圖像時,它顯然是以錯誤的方式解碼的。

所以我的問題是:我該如何正確打開這樣一個jpeg文件?或者說,我該如何正確解碼這些圖像內容的全部內容?

我現在試圖理解使用MATLAB的文件結構。最終,我將使用Python + OpenCV(或者如果需要,使用Python + Cython + libjpeg-turbo)將整個圖像讀入內存。

+0

因爲我沒有要測試的圖像,所以很難說,但是如果你在處理大圖像時一定要考慮使用'vips'。它擅長於... http://stackoverflow.com/a/36377369/2836621 –

+0

我相信這是一個libjpeg或libjpeg渦輪問題。 VIPS正在使用其中之一。所以只要切換到VIPS就不會解決這個問題。 – user3667217

+0

我已經編寫了自己的圖像庫(包括自定義JPEG編解碼器),並且此圖像可能會被我的代碼打開。極端的大小是一次打開它的一個問題。我可以打開縮放後的副本(1/8 x 1/8 = 14848/12800)或打開特定的矩形裁剪。完整的res顏色未壓縮圖像需要36GB的RAM。 – BitBank

回答

0

沒有任何更多的線索,只是一些言論:

  • 65500x65500 = 3GIO /通道(工作)
  • 122880 * 78848 = 9GiO /通道(目標)

這些都已經巨大連續內存量特別是在Windows上,這對這類應用程序有一些限制(take a look at this for more info

首先,您可以提供您的計算機或軟件與您試圖打開此圖像的任何細節? (RAM的數量,交換,分配給用戶空間的最大內存等)

完全隨機猜測,你試過用ImageJ嗎?

是否可以隨時打開你想看的區域(我不確定你想看到整個圖像)?

爲什麼不使用多尺度圖像表示?

編輯:我剛纔看到有tools for your file format to be converted in TIFF done by the IN2P3。這也讓我懷疑你是否真的有隱藏的JPEG或TIFF。

+0

我確實需要內存中的整個圖像。 ImageJ甚至無法打開像素分辨率大於65535的文件。我的計算機上有32 GB的RAM。我試圖在Windows照片查看器和Photoshop中打開該文件,兩者都給了我相同的顯示。 – user3667217

0

我會使用openslidevips,它有快速和直接的支持ndpi圖像。然後,您可以將解碼圖像複製到matlab或numpy中,或者僅使用vips進行處理,具體取決於您需要執行的操作。

例如,我可以寫:

#!/usr/bin/python 

import sys 
import gi 
gi.require_version('Vips', '8.0') 
from gi.repository import Vips 

im = Vips.Image.new_from_file(sys.argv[1]) 
im = im.crop(1000, 1000, 2000, 2000) 
im.write_to_file(sys.argv[2]) 

然後,當運行:

$ time ./try228.py ~/Desktop/pics/2013_09_20_29.ndpi x.png 
memory: high-water mark 15.24 MB 
real 0m1.561s 

這對於一個118784 X 102400像素的圖像。

您還可以使用vips將ndpi圖像轉換爲像ppm這樣簡單的東西。這應該是微不足道的加載到內存中。

$ vips copy ~/Desktop/pics/2013_09_20_29.ndpi huge.ppm 

你打算做什麼樣的處理?

如果您好奇,openslide網站有nice overview of the ndpi file format

有一個64-bit Windows binary for vips here。只需解壓縮並運行vips.exe

vips GUI, nip2,將無法​​處理您的圖像。 There's a windows installer。啓動該程序並單擊文件/打開,或從資源管理器拖入.ndpi圖像。雙擊主窗口中的縮略圖以打開查看窗口。使用工具箱菜單處理圖像。按F1尋求幫助。

+0

感謝您的回答。我確實諮詢了openslide代碼以幫助我理解ndpi格式。我需要的是:1:將整個圖像轉換爲深度縮放圖像格式。 2:爲了圖像處理的目的,將整個圖像讀入存儲器。對於1)我認爲openslide + vpis可以完成這項工作,因爲它不涉及閱讀整個圖像,現在是第二個需要解決的問題。 – user3667217

+0

是的,對於1)只要做'vips dzsave slide.ndpi my-pyr-name'。對於2)我會轉換爲ppm並加載到內存中,它應該很容易。你打算做什麼處理? – user894763

相關問題