MENU

少量Matlab代码实现共聚焦图片荧光强度分布提取

2024 年 04 月 15 日 • 阅读: 138 • Matlab阅读设置

本博客第一篇文章,是此前Q与我共同撰写的。

本文主要使用的是Matlab而非Wolfram,抛玉引砖,以飨读者。

多数从事生物相关科研方向的同学都会对细胞进行共聚焦拍摄。得益于共聚焦成像的原理,进行共聚焦成像技术我们可以得到横向对比度较高的图片。说白话就是,背景很黑,信号很亮,边缘很锐利,图片很好看。

我们通常会在待发表的文章中附上对照组与实验组的共聚焦照片,组间对比来说明实验的效果有多好,比如这样👇:

image

本图来自参考文献

Wolf B, Piksa M, Beley I, et al. Therapeutic antibody glycosylation impacts antigen recognition and immunogenicity[J]. Immunology, 2022, 166(3): 380-407.

有一些也会带上明场图片。

Anyway,大家看文献的时候还会发现有这样的👇:

image

本图来自参考文献

Wen D, Li K, Deng R, et al. Defect-Rich Glassy IrTe2 with Dual Enzyme-Mimic Activities for Sono-Photosynergistic-Enhanced Oncotherapy[J]. Journal of the American Chemical Society, 2023, 145(7): 3952-3960.

当我们将荧光强度提取出来之后,我们可以更直观地表述我们的结果。

今天这篇文章就来教大家如何使用Matlab这款软件,以少量代码实现图中的效果。

首先,我们打开Matlab软件,在软件的左方导航栏,通过鼠标点击,来到我们存放共聚焦照片的文件夹:

image

在这里,我们可以看到我们要处理的对象文件。

还可以看到Matlab软件的不同分区,接下来我们就在命令行窗口(也就是正中间那个窗口,如果你有打开的matlab文件,则命令行窗口一般在正下方位置)输入我们的命令对图片进行处理。我们一步一步来:

首先,我们将我们要处理的文件导入(在这里,我要处理的是 1(4).tif),大家注意,一定要导入你拍摄之后直接导出的原始tif文件,不要去进行任何修图软件的修改。

原图1(4).tif长这样👇:

image

首先感谢Dr.Yin提供的图片,Respect!🫡

导入图片(需要先改一下工作目录,或者输入文件名的时候直接把路径加上就可以):

im1=imread('1 (4).tif');

最后面的封号;是为了防止产生输出(输出并不会影响计算结果,只是在遇到比较大的矩阵时会特别耗时),目前的输出结果对我们来说不需要,所以不用看。敲一下回车就行,此时会在右边的工作区看到有显示:

image

我们看到工作区中已经有了新的变量,名称是im1,值是932x932x3 uint8(uint8是8位无符号整形的意思,如果图片的精度不一样也可能是uint16等等)

从中我们可以知道这张图的维度(或者说尺寸)是932x932的,也就是说有932x932个像素点,每个像素点都包含3个值,也就是我们常说的RGB三原色。每个人的图的大小都可能不一样,这一步请注意一下你的图片大小是否与你实验预期的一致,该大小在后续代码中是需要参考的

此时我们思考一个问题:最终的效果图只有三个维度,分别对应原图的X轴、Y轴以及每个像素点的强度值。可此时我们导入的图片数据中,每个像素点有3个值,似乎对应不上。

所以我们需要先对该数据进行预处理,将每个点的RGB值(3个)转变成灰度值(也就是归一化之后的,1个),代码如下:

data1=rgb2gray(im1);

敲一下回车。
此时工作区中已经出现data1的信息了:

image

OK,此时我们的图片数据已经对应上我们最后想要画出的强度分布图了。我们先看一下data1中的最大值是多少,这样可以确定最后强度图中z轴的取值范围:

max(data1(:))

我这里的结果是76。

image

这里需要提醒大家一点!

我们应该对每一张图都进行导入,读图,转灰度值等操作,然后各自算出数据的最大值,以此来确定最后每张图画图的取值范围等参数

现在我们要使用data1进行画图,代码如下:

mesh(data1)  
axis([0 940 0 940 0 80])  
clim([0,80])
hc=colorbar
hc.Limits=[0,80]
hc.Position=[0.911197757390418,0.130560747663551,0.016309887869521,0.815]
view(-37.5,30)

此时,软件界面会自动跳出来一张图,也就是我们处理得到的强度分布图:

image

我们来一行一行分析我们的代码。

首先是第一行 mesh(data1)。这一行代码大家可以简单理解为画图的函数,类似于很多编程语言里的Plot函数或者类似于一些画图成品软件里那个点一下就run的按钮。 这个命令是用来画二维图像的。

第二行代码 axis([0 940 0 940 0 80])的作用是告诉Matlab,去规定出图的坐标轴范围,在这里对应于X Y Z轴的范围分别是0-940,0-940,0-80。这些范围的上限信息就是从前面我们对于图片维度的判断以及data1的最大值来决定的,大家应该根据自己图片的具体情况来具体设置

第三行代码 clim([0,80])的设置非常重要 ! 大家通常要处理的图片不止一张,并且还需要相互间进行横向或纵向比较,来说明实验结果的意义。此时,我们就需要保证一点,所有用于比较的图片的Bar必须是一样的。也就是说,每张图上相同颜色相同浓度的像素点,代表的是一样的强度。 clim函数就是用于对画图所使用的颜色规定上下限,在这里,我们规定上限是80,下限是0(因为data1的最大值是76,我们向上取到80)。也就代表着,80的强度值是最强(最黄),0的强度值是最弱(最蓝)。注意,clim函数的使用必须保证Matlab的版本在R2022a及更新版本,R2022a版本之前的Matlab请更改为caxis函数。

第四行代码 hc=colorbar是告诉Matlab软件,在给出的图片中附上对应的Color Bar。并把Color Bar的句柄保存在变量hc中,这样可以方便后续对这个colorbar的操作。也可以直接在命令行中输入 get(hc)查看都有哪些属性可以修改,比如常见的位置、字体、字号、长度、宽度、方向等都可以随意修改。

第五行代码 hc.Limits=[0,80]则是告诉Matlab,Color Bar上标注的数值范围是0-80。

第六行代码 hc.Position=[0.911197757390418,0.130560747663551,0.016309887869521,0.815]是规定Color Bar在成品图中的位置,这里的位置是用四个数来表示位置,依次是左侧位置、底边位置、宽度、高度,它默认的单位是归一化单位,也就是图片的最左侧是0,最右侧是1,高度也是一样的,最下面是0,最上面是1,所以在拖动图片改大小的时候它也会跟着变。

第七行代码 view(-37.5,30)规定成品图的观看视角。

是的,成品图可以通过拖拽改变视角,也可以拖动Color Bar来修改它的位置,从而得到让自己满意的成品图的效果。所以给出的示例代码中的值是可以根据你自己的需求进行修改的。

现在我们就可以按住figure窗口中的图进行拖拽,来找到一个合适的视野角度,先把鼠标放在图片上,点击出现的右上角的旋转圈样式的图标。

image

拖拽之后就可以改变视野,比如这样:

image

此时,我们可以在命令行窗口输入代码 [caz,cel]=view()来确定当下图片的视角值。
视角值一般就是两个值,得到合适的视角值之后就可以用于替换示例代码中的第七行 view(-37.5,30)括号内的值了

image

讨论完旋转调节视角,现在我们讨论一下如何更改图中各元素的水平位置。

现在我们回到Matlab软件中跳出的 figure 窗口,点击查看按钮,再点击 属性编辑器 按钮,进入属性编辑器:

image

将窗口最大化后,我们会发现和小图显示效果差距很大:

image

图片的显示效果变差了,没关系,最后改就可以。

我们可以点击图中的任意元素,比如主图,比如Color Bar。这里,我点击选中Color Bar作为示例讲解。 请注意,一定要最大化窗口,并且不要随便关闭,否则图窗改变,后续处理的其他图片不具备跟当下结果的可比性!

image

选中Color Bar,然后点击右下角的更多属性按钮,我们就可以看到Color Bar的属性了。

image

image

往下拖拽,我们就可以看到位置的属性,点开小三角,Position的值就是当下图中Color Bar的位置信息了,我们可以通过拖拽Color Bar来更改和确定当下Color Bar的位置,当确定合适的位置后,我们就可以把Position框中的值拷贝,回到代码界面,赋给hc.Position。 也就是把0.911197757390418,0.130560747663551,0.016309887869521,0.815这几个值改成你要的值

现在,我们还剩最后一步就可以获得第一张高质量的可用的强度分布图了。

我们选中主图,然后点击右下角的 选项:

image

然后选择 混合(插补)

image

这样我们的图就变得饱满好看了。

image

然后我们就可以将自己满意的图片导出。
我们点击图窗视角下左上角的文件按钮:

image

选择导出设置,并点击打开
image

image

选择跟我一样的设置,然后点击右侧的导出按钮,选择好自己要存放结果图片的文件夹,选择好自己要保存的文件的类型(一般我们选择TIFF格式),就可以了。

最后,我们写一下汇总的代码。希望大家可以看完这篇文章,从而明白每一行代码的具体执行目的,这样就可以根据自己的需求来修改代码了。 请将该代码保存为Matlab的m文件并将文件放在存放你的图片的文件夹中 或者 在导航栏进入对应文件夹中后输入代码
建议每张都单独处理,并牢记中途不要关闭窗口,保持图窗稳定

%读图
im1=imread('1.tiff');
%转数据为灰度值
data1=rgb2gray(im1);
%确定z轴的范围
max(data1(:))
%开始画图
mesh(data1)
axis([0 940 0 940 0 80])
clim([0,80])
hc=colorbar
hc.Limits=[0,80]
hc.Position=[0.911197757390418,0.130560747663551,0.016309887869521,0.815]
view(-37.5,30)

当然如果你觉得图片和程序文件放在一起管理起来不方便,也可以把上面的代码修改一下,把读图部分改成如下程序就可以。

[filename,pathname] = uigetfile({'*.tif;*.jpg'});
%读图
im1=imread([pathname,filename]);

第一行会给出一个对话框,可以选择电脑上的文件,如果需要增加其它后缀,就在uigetfile这个函数里面的单引号之间加上一个分号;再加上后缀名就可以,比如加上png格式,那就把程序改成 [filename,pathname] = uigetfile({'*.tif;*.jpg;*.png'});,上面的命令matlab里面有更多的介绍,如果需要更多的修改可以查询相应函数的帮助文件。

本文章使用的是Mac OS操作系统 Monterey,系统版本12.3.1,Matlab版本为R2022b。

祝大家科研愉快🤓!

本文由Q与madun贡献
最后编辑于: 2024 年 05 月 06 日