簡體   English   中英

Python圖像分析:從共聚焦顯微鏡讀取多維TIFF文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM