当要对大量数据进行分析之前,须先快速预览数据。了解一些基本情况是非常必要的。这里整理了下我常用的预览成像数据使用的代码。
首先是导入一些必要的模块,并准备好一些自定义函数。一个是批量读取指定文件名后缀的函数 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值即可。所以这里通常估计得运行两遍。