当要对大量数据进行分析之前,须先快速预览数据。了解一些基本情况是非常必要的。这里整理了下我常用的预览成像数据使用的代码。
首先是导入一些必要的模块,并准备好一些自定义函数。一个是批量读取指定文件名后缀的函数 getFileList,相比于 glob 函数,它能够递归地寻找所有复合条件的文件。这种情况是避免有些用户文件层级或命名异常。第二个自定义函数创建基本colormap,方便给不同的通道上伪彩。
%matplotlib inline%config InlineBackend.figure_format='svg'import matplotlib.pyplot as pltimport matplotlib.colors as mcolors# 让matplotlib支持中文显示,注意系统是否已安装DengXian(等线)字体# https://zhuanlan.zhihu.com/p/53195772import matplotlib as mplmpl.rcParams['font.family'] = 'DengXian'plt.rcParams['axes.unicode_minus'] = False
from aicsimageio import AICSImageimport 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值即可。所以这里通常估计得运行两遍。