python基础教程

2024-09-06-82-1782907426491.webp

终于把面向初学者的 python 基础教程完成了。网上名为「python教程」的内容浩如烟海,但是大多都是面向软件开发人员的教程,其中代码知识极广极深,并不适合以成像数据分析为目的的小众科研用户。

为啥要学python编程

且慢,为啥要学 python 呢?图像数据分析,前面已经学习了「ImageJ基础教程」,甚至还有「ImageJ进阶教程」,难道还不够吗?我认为对于刚进入实验室头一两年的新生,ImageJ是足够而且必要的,但随着研究课题不断深入,以及要处理的数据量和数据分析复杂程度的不断增加时,ImageJ 可能就捉襟见肘了。

ImageJ基础教程

终于把面向初学者的 ImageJ ^1 基础教程完成了。虽然网上各种教程很多,但大多都是针对特定分析需求的知识碎片,或难或易,或深或浅。而初学者到底要掌握哪些知识却并不清楚。 且慢,为啥要学 ImageJ 呢?我想如果你必须要自己处理一些图像数据的话,ImageJ是最佳的入门选择。原因如下: 1....

ImageJ进阶教程

ImageJ进阶教程可帮助您提升成像数据分析能力,并完成编程入门。 引言 在搞完基础教程之后,对于要不要继续出一个进阶教程,我是有点犹豫的。因为我希望教程能够帮助更多的人,但是「进阶」往往意味着聚焦到具体的领域,造成其适用性变差。最后可能会变得与网上很多碎片化的教程一样:如果你不做这个细分专业方向,...

除了 ImageJ,还有大量其它软件可供选择。比如一些商业化的软件AmiraImarisArivisAivia 等等,或者是开源的其它软件,比如 IlastikIcy 等等(image.sc论坛中还有更多),甚至以 python 代码为主的还有 napari 等,这么多工具和各种各样的插件,难道不够用还要自己学习编程吗?

首先,学习编程和使用上述软件并不是非此即彼的关系。如果因为自己会编程就什么问题都尝试自己编程毫无疑问是愚蠢的。事实上很多编程教程都会在开篇就告诫大家,「不要重复造轮子」。

然后上述各类软件工具通常满足的是已经被解决的比较大众化的需求,特别是商业软件,只有是比较普遍的需求它们才能够赚到钱。来自科研一线的数据分析需求总是各不相同且日新月异。实际经常出现的情况是:一个分析需求需要多种工具配合来满足其中 95%,剩下5%要靠自己手动操作。然后这5%就成了关键限速步骤。

事实上这5%的工作量也分两种情况。一类是真的难,需要独特的算法。但这一类概率很低,多查查资料问问大佬总归能找到解决方案,所以这里不作过多讨论。

第二类是重复繁琐的难,这一类非常常见。通常是需要自动化地做好大量数据在多个分析工具(甚至是功能模块函数)之间的流转,或者是一些简单的文件IO操作。第二类情况就属于是 python 编程可以大展身手的地方,毕竟它作为「胶水语言」的响亮名头不是盖的。

内容安排

搞定了「学习python的必要性」这个问题,接下来就要说下我这份「python基础教程」的主要内容。

秉承前面 ImageJ 教程系列的风格,这份 python基础教程以完整实例贯穿整个教程,将「数据结构」、「语法」、「常用模块」等等内容糅合到实战当中。我不会按部就班地给大家从什么「变量」、「列表」、「字典」这种编程的概念讲起。概括起来本教程主打实用,核心就是四个字:边干边学

开干之前,需要先准备好 python 的编程环境,我推荐 Anaconda + VSCode,具体可以看看我之前的博文👇。

文章obsidian-python环境布置

人生苦短,我用 python。因为python 像胶水一样,能够黏合各种程序和工具的功能,按照个人独特的需求,形成完整丝滑的工作流。在这个obsidian模板库中,与文献相关的核心功能都依赖 python 完成。 此外,科研项目中实验数据的整理和计算分析,还有一些机器学习的应用,都可以使用 pyth...

conda虚拟环境创建与备份

这里以安装napari为例,介绍使用conda创建和管理虚拟环境以满足不同的软件环境依赖要求。 python有着非常丰富的软件生态,但不同的软件工具要求有不同的环境依赖。如果都进行默认安装到 Anaconda的 base 环境,很容易造成原有的环境的破坏,造成原有软件的无法使用。因此比较好的做法是:...

INPUT:本教程充分与前面的 ImageJ 教程衔接。展示了如何使用 python 读取 ImageJ 保存的文件来进行后续分析。在文件读取方面,主要以 TIFF 图像文件,CSV数据表文件和 选取ROI记录文件为例。具体可见下方博文。

文章批量获取文件路径

我们编程很多时候是希望批量处理大量文件,那么第一步就是要能够批量地读取这些文件。 举个例子,我们某次实验,设置了不同的条件,还有不同的时间,产生了一系列的数据文件。其文件夹路径结构是 condition/timepoint/file 。 如果文件夹和文件名比较规范,我们可以使用 glob 函数结合通...

规范命名以便高效读取数据

这里展示使用代码批量读取成组数据的多个文件并自动整理。 前面使用 ImageJ 保存了 tif 文件和对应的 ROI记录,并且按照 {name}.tif 和 {name}s.zip 的命名规则分别对 tif 文件和 ROI 记录文件做好了命名。有了规范文件命名的前提,接下来我们就可以很轻松地批量地成...

读取TIFF文件和ROI记录

这里介绍使用 AICSImage 和 roifile 来读取从 ImageJ 中保存的 TIFF 高维图像和 ROI 记录。 读取TIFF图像文件,之前我常用的是 scikit image 中提供的方法: 读取的数据其实就是一个 np.array,可以使用 numpy 这个强大的库进行各种矩阵计算,...

批量读取蔡司czi文件

此文介绍如何使用aicsimageio模块读取蔡司显微镜成像数据文件,并展示实际处理数据在INPUT阶段的问题。 软件环境 按照官网说明,除了安装aicsimageio模块之外,还需要安装一些东西。目前我测试过可用的python环境和关键模块版本如下: 这里专门列出来是,是因为发现在我另外一个 py...

ESTIMATE:读取了这些数据文件要干什么呢?一个例子是展示了根据ImageJ划线测量的 profile 来估计成像分辨率。这里主要是涉及到了曲线拟合。曲线拟合能够帮助我们提取原始数据中隐含的重要模型参数。曲线拟合非常常用,除了估计分辨率,还能估计荧光漂白恢复时间。具体可见下方博文。

高斯拟合计算成像分辨率

这里简单展示如何对高斯分布的曲线进行拟合以计算成像分辨率。 由于中心极限定理,我们采集到的数据经常呈现正态分布(也叫高斯分布)。成像数据中,有时我们需要评估成像的分辨率。一个比较直接简单的做法,是找到单个光斑进行划线测量,或者是对线性结构(如细胞微管)的进行垂直划线测量。 中心极限定理说的啥?它说样...

曲线拟合计算荧光漂白恢复时间

这里以荧光漂白恢复曲线计算恢复时间为例介绍python做曲线拟合。 这是一个典型的荧光漂白恢复曲线 ^1 。其中给了一个时间参数,这个参数就是通过曲线拟合来得到的。 Images were processed with the Fiji open source software, and recov...

一维数据插值以改善拟合效果

对于曲线拟合,如果数据点太少,可能导致拟合效果糟糕。所以有时候需要一维插值。 我就遇到过这种情况,如上图所示,原始数据中采样数太少,然后还想做双峰拟合,结果啥也不是。线性插值之后,双峰拟合的效果好了一点,但还是不理想。因为这两个峰的两侧基线可能相差较大而且数据点比较少,所以我又增加了侧翼,这才拿到比...

高斯双峰拟合

这里展示如何使用curve fit进行高斯双峰拟合。 其实双峰或者多峰拟合的思路非常简单,就是把单个 gaussian 函数加起来,形成一个新的函数,再使用 curve fit 进行拟合。比较繁琐的是,参数数量倍增。 然后一个很容易理解的情况是,参数越多,拟合难度越大。因此可以在 curve fit...

CALCULATE:除了曲线拟合,我们可能还需要对图像中的信息进行加减乘除等简单运算。例如提取ROI内的所有像素值然后直方统计。这里我提供了一个实例,展示了一种简单的信噪比估计方法。

文章收集ROI内的像素值

如果想收集图像ROI中所有像素值且无需保留矩阵结构,可以使用以下函数。 ROI记录通常包含的是ROI轮廓线条的锚点的坐标,我们实际上想获得是这个ROI区域内的所有像素的值。这里使用了 scikit image 中的 draw.polygon 函数,这个函数输入锚点坐标后,会返回该区域内所有位置的索引...

简单计算信噪比

信噪比是评估一个新的成像探针或者成像方法的重要指标之一。 最近看到一篇文章 ^1 ,用到一种比较直观简单的信噪比估计方式。其基本思路是: 1. 选取信号区域和背景区域ROI若干 2. 假定信号区域的信号强度实际是真实强度与背景噪声强度的叠加,记作 SIG+BACK 3. 然后将信号区域的 SIG+B...

OUTPUT:最后,当我们使用 python 完成了分析之后,还要把结果再整理和保存起来。图表图表,从图到表。所以我喜欢尽量保存数据结果为表格的形式。详见👇

汇总数据表并导出

介绍pandas模块用于数据表分类汇总和导出。 2024 09 06 78 2024 09 06 79 承接上文,我们对每个数据的计算中间结果都存放到一个字典中,再把多个数据 item 放到一个列表 box 中。接下来就需要收集我们所有的计算结果,整合到一个数据表(dataframe),以便汇总分析...

事实上在数据分析过程中保存一些好不容易得到的中间数据也是非常必要的。这一点我在中间部分的博文中也多有提及。

小结

因为这个教程是一个实例中拆解出来的,所以从 input 到 calculate,estimate 到最后 output,还是比较完整的。

在这个教程中,大量核心功能我都是使用的第三方的模块(俗称调包侠)。比如使用 pandas 来处理表格,通过 numpy 来处理图像数值矩阵,通过 AICSImage 和 roifile 来读取图像文件和ROI 记录,通过 curve_fit 来做曲线拟合…。这些模块也是软件工具的一种形式,只不过是以代码的形式存在。

学编程的好处就是自然而然地获得「函数」思想,所以这里可以更概括一点地说;一切工具皆函数,管好Input和Output,我们只需for和if。

最后附上本教程使用的数据集,方便大家练习。👇

链接: https://pan.baidu.com/s/1Q8WNpuTXN-KagisfsiSSJA

提取码: uruh