当要对大量数据进行分析之前,须先快速预览数据。了解一些基本情况是非常必要的。这里整理了下我常用的预览成像数据使用的代码。

首先是导入一些必要的模块,并准备好一些自定义函数。一个是批量读取指定文件名后缀的函数 getFileList,相比于 glob 函数,它能够递归地寻找所有复合条件的文件。这种情况是避免有些用户文件层级或命名异常。第二个自定义函数创建基本colormap,方便给不同的通道上伪彩。

%matplotlib inline
%config InlineBackend.figure_format='svg'
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
# 让matplotlib支持中文显示,注意系统是否已安装DengXian(等线)字体
# https://zhuanlan.zhihu.com/p/53195772
import matplotlib as mpl
mpl.rcParams['font.family'] = 'DengXian'
plt.rcParams['axes.unicode_minus'] = False

from aicsimageio import AICSImage
import os


def getFileList(wks, ext):
    '''ext 为文件后缀名'''
    flist = []
    for root, ds, fs in os.walk(wks):
        for fname in fs:
            if fname.endswith(ext):
                fpath = os.path.join(root, fname)
                flist.append(fpath)
    return flist


def create_basic_colormap(color_name, num_colors=256):
  # 定义黄色范围的RGB值
    bcmap = {
        'red': (1, 0, 0),
        'green': (0, 1, 0),
        'blue': (0, 0, 1),
        'yellow': (1, 1, 0),
        'cyan': (0, 1, 1),
        'purple': (1, 0, 1),
        'gray': (1, 1, 1)
    }
    assert color_name in bcmap
    colors = []
    color = bcmap[color_name]
    for i in range(num_colors):
        # 计算亮度值 (从0到1)
        brightness = i / (num_colors - 1)
        # 计算RGB值,注意保持色调,改变亮度
        r = color[0] * brightness
        g = color[1] * brightness
        b = color[2] * brightness
        colors.append((r, g, b))
  # 创建一个线性分段colormap
    cmap = mcolors.LinearSegmentedColormap.from_list(f"{color_name}_gradient", colors)
    return cmap

接下来具体的使用如下所示:

fps = getFileList(wks='./', ext='czi')

luts = {
    'default': create_basic_colormap('gray'),
    'DAPI': create_basic_colormap('blue'),
    'AF488': create_basic_colormap('green'),
    'AF568':  create_basic_colormap('yellow'),
    'AF647': create_basic_colormap('red'),
}

for fp in fps:
    img = AICSImage(fp)
    channels = img.channel_names
    fig, axes = plt.subplots(ncols=len(channels), figsize=(4*len(channels),4))
    ax = axes.ravel()
    for idx, ch in enumerate(channels):
        cht = ch.split("-")[0]
        if cht in luts:
            cmap = luts[cht]
        else:
            cmap = luts['default']
        frame = img.get_image_data("YX", C=idx)
        ax[idx].imshow(frame, cmap=cmap)
        ax[idx].set_title(ch)
    pixelsize = img.physical_pixel_sizes.X
    plt.suptitle(fp+f"\npixelsize: {pixelsize:.3f} μm")
    plt.tight_layout()
    plt.show()

上面一段代码中,luts是预设的颜色映射表。注意zeiss的显微镜默认的 channel_name的命名规则通常是 Dye-Tn,所以我使用 split 方法提取 dye 的名字。如果是其他染料,可以修改 luts 中的key值即可。所以这里通常估计得运行两遍。

2025-04-30T08:17:58.png

最后修改:2025 年 05 月 21 日
请大力赞赏以支持本站持续运行!