[英]Python image analysis: reading a multidimensional TIFF file from confocal microscopy
我有一個共聚焦顯微鏡的TIFF圖像文件,可以在ImageJ中打開它,但是我想進入Python。
TIFF的格式如下:Z方向上有30個堆棧。 每個Z層都有來自不同熒光標記的三個通道。 每個通道的深度為8位。 圖像尺寸為1024x1024。
原則上,我可以使用tifffile插件讀取skimage文件(我打算將其用於進一步分析數據)。 但是,我得到的並不是我所期望的。
merged = io.imread("merge.tif", plugin="tifffile")
merged.shape
# (30, 3, 3, 1024, 1024)
# (zslice, RGB?, channel?, height, width)
merged.dtype
# dtype('uint16')
最初讓我感到困惑的是,我得到了兩個長度為3的軸。我認為這是因為tifffile將每個通道視為單獨的RGB圖像,但是我可以通過在單個通道上設置子集或使用skimage.color.rgb2grey
來解決此問題。 。 更令我擔心的是該文件是作為16位圖像導入的。 我可以使用skimage.img_as_ubyte
將其轉換回去, 但是之后,直方圖不再與我在ImageJ中看到的匹配。
我並不確定使用skimage導入文件,但是我想將圖像最終轉換為numpy數組以在其上使用skimage的功能。
我在處理.tif文件時遇到了相同的問題。 我建議使用bioformats python軟件包 。
import javabridge
import bioformats
javabridge.start_vm(class_path=bioformats.JARS)
path_to_data = '/path/to/data/file_name.tif'
# get XML metadata of complete file
xml_string = bioformats.get_omexml_metadata(path_to_data)
ome = bioformats.OMEXML(xml_string) # be sure everything is ascii
print ome.image_count
根據數據,一個文件可以保存多張圖像。 可以按以下方式訪問每個圖像:
# read some metadata
iome = ome.image(0) # e.g. first image
print iome.get_Name()
print iome.get_ID()
# get pixel meta data
print iome.Pixels.get_DimensionOrder()
print iome.Pixels.get_PixelType()
print iome.Pixels.get_SizeX()
print iome.Pixels.get_SizeY()
print iome.Pixels.get_SizeZ()
print iome.Pixels.get_SizeT()
print iome.Pixels.get_SizeC()
print iome.Pixels.DimensionOrder
將圖像0的原始數據加載到numpy數組中是這樣完成的:
reader = bioformats.ImageReader(path_to_data)
raw_data = []
for z in range(iome.Pixels.get_SizeZ()):
# returns 512 x 512 x SizeC array (SizeC = number of channels)
raw_image = reader.read(z=z, series=0, rescale=False)
raw_data.append(raw_image)
raw_data = np.array(raw_data) # 512 x 512 x SizeC x SizeZ array
希望這有助於處理.tif文件,干杯!
我不確定'hyperstack to stack'
功能是否就是您想要的。 超級堆棧只是多維圖像,可以是4D或5D(寬度,高度,切片,通道(例如,對於RGB為3)和時間范圍)。 在ImageJ中,超級堆棧中的每個維度都有一個滑塊。
堆棧只是以某種方式相關的堆棧2D圖像,並且只有一個滑塊,在最簡單的情況下,它表示3D數據集中的z切片。
'hyperstack to stack'
功能可將超級堆棧中的所有尺寸堆疊在一起。 因此,如果您有一個具有3個通道,4個切片和5個時間幀的超堆棧(3個滑塊),則將獲得3x4x5 = 60
張圖像的堆棧(一個滑塊)。 與上面提到的基本相同,每個通道在焦平面上滑動。 您可以通過使用'stack to hyperstack'
另一種方法,並通過定義堆棧中的哪些切片代表哪個維度'stack to hyperstack'
制作超堆棧。 在上面提到的示例文件中,只需選擇順序xyzct,3個通道和7個時間點。
因此,如果您的tiff文件具有2個滑條,則它似乎是具有高,寬,30個切片和3個通道的4D超級堆棧。 'hyperstack to stack'
將所有尺寸堆疊在一起,因此您將獲得3x30=90 slices
。
但是,根據skimage tiff閱讀器,您的tiff文件似乎是某種5D超堆棧。 寬度,高(1024x1024),30個z切片,3個通道(RGB)和具有3個條目的另一個尺寸(例如時間范圍)。
為了找出問題所在,我建議將維度與從skimage獲得的數組的3個條目進行比較。 找出其中一個代表RGB通道,另一個代表什么。 例如,您可以使用pyqtgraph的圖像功能:
import pyqtgraph as pg
merged = io.imread("merge.tif", plugin="tifffile")
#pg.image takes the dimensions in the following order: z-slider,x,y,RGB channel
#if merged.shape = (30, 3, 3, 1024, 1024), you have to compare the 1st and 2nd dimension
pg.image(merged[:,0,:,:,:].transpose(0, 2, 3, 1))
pg.image(merged[:,1,:,:,:].transpose(0, 2, 3, 1))
pg.image(merged[:,2,:,:,:].transpose(0, 2, 3, 1))
pg.image(merged[:,:,0,:,:].transpose(0, 2, 3, 1))
pg.image(merged[:,:,1,:,:].transpose(0, 2, 3, 1))
pg.image(merged[:,:,2,:,:].transpose(0, 2, 3, 1))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.