在进行免疫荧光多重荧光分析时,有时候需要分析两个荧光信号的比值。其实单个图片分析的方法很简单,基本逻辑就是通道拆分🡪分别对两个荧光图进行平均荧光强度分析🡪计算比值。以下图为例,我来给大家演示。
PS:该图来源于网友的咨询,如何进行批量分析所有图片的红绿荧光比值。这个免疫荧光图片并不典型,细胞中间没有信号,会导致常规threshold确定细胞选取的方式不太准确。

1. 首先拆分通道
拆分之前先Image 🡪 Color 🡪 Channels tool,点击more,Make Composite

随后Image 🡪 Color 🡪 Split channels得到红绿蓝三个通道单独的图片

2. 针对绿色通道:Image 🡪 Type 🡪 8-bit,变成黑白图片。
3. 随后使用Image 🡪 Ajust 🡪 Threshold,勾选Dark background,滑动两个轨道,使得所有细胞均被选中。

4. 此时聪明的你会发现演示的这个图片不能选中细胞中间区域,这样计算结果就不是所有细胞的平均荧光强度,不要着急,继续往下看。当然,如果你的图片细胞都被选中,不用进行这一步。直接点击apply到步骤5。
确定细胞选取,我们最好以merge的原图确定,重新打开原图,Image 🡪 Type 🡪 8-bit,Image 🡪 Ajust 🡪 Threshold,勾选Dark background,滑动两个轨道,使得所有细胞均被选中,点击apply。随后关键来了,点击process 🡪 Binary 🡪 Fill holes,神奇的一幕出现:

5. 创建选区 Edit 🡪 Selection 🡪 Creat Selection

6. 保存选区:Analyze 🡪 Tools 🡪 ROI(Region of Interest) manager,调出的窗口中点击Add,可以看到选取已被保存。

7. 切换到拆分出来的绿色荧光图片,已经转换成8-bit的灰度图片,点击ROI manager中保存的选区,可以看到所有细胞已被选中。

8. 计算平均荧光强度:Analyze 🡪 Measure ,mean及为平均荧光强度。

9. 同样的方式处理红色荧光

10. 计算比值:101.24/125.2
接下来,按照上述逻辑,咱们编写批量分析脚本,复制保存为txt即可
// 选择图像文件夹
dir = getDirectory("Select the source directory");
//if (dir==null) exit("未选择文件夹。");
// 获取文件列表
files = getFileList(dir);
if (files.length == 0) exit("文件夹中没有文件。");
// 清空结果表
if (isOpen("Results")) {
selectWindow("Results");
run("Clear Results");
}
// 准备 ROI 管理器
roiManager("Reset");
setBatchMode(true);
count = 0;
for (i = 0; i < files.length; i++) {
path = dir + files[i];
// 仅处理常见图像格式
if (!endsWith(files[i], ".tif") && !endsWith(files[i], ".TIF")
&& !endsWith(files[i], ".tiff") && !endsWith(files[i], ".TIFF")
&& !endsWith(files[i], ".png") && !endsWith(files[i], ".PNG")
&& !endsWith(files[i], ".jpg") && !endsWith(files[i], ".JPG")
&& !endsWith(files[i], ".jpeg") && !endsWith(files[i], ".JPEG")) {
continue;
}
// 打开图像
open(path);
title = getTitle();
// 在原图上构建细胞区域 ROI:8-bit -> 阈值 -> 掩膜 -> 填洞
selectWindow(title);
maskTitle = "MaskSrc-" + title;
run("Duplicate...", "title=[" + maskTitle + "]");
selectWindow(maskTitle);
run("8-bit");
setAutoThreshold("Default dark");
//run("Threshold...");
setThreshold(20, 255);
// 根据阈值生成二值掩膜并填洞
run("Convert to Mask");
run("Fill Holes");
// 将掩膜转为选择区域(可能是复合选择)
run("Create Selection");
hasROI = true;
if (selectionType()==-1) {
hasROI = false;
} else {
roiManager("Reset");
roiManager("Add"); // 将当前选择作为一个 ROI 加入
}
close(); // 关闭掩膜源
// 拆分通道
selectWindow(title);
run("Make Composite");
run("Split Channels");
// 可能的通道窗口名称(RGB 与 Composite 两种情况)
redTitle1 = title + " (red)";
greenTitle1 = title + " (green)";
redTitle2 = "C1-" + title;
greenTitle2 = "C2-" + title;
// 初始化
redMean = NaN;
greenMean = NaN;
// 如果没有 ROI,跳过测量(也可选择测整图,这里设为 NaN)
if (hasROI) {
// 红通道测量(套用 ROI)
if (isOpen(redTitle1)) {
selectWindow(redTitle1);
run("8-bit");
roiManager("Select", 0);
getStatistics(area, mean, min, max, std);
redMean = mean;
close();
} else if (isOpen(redTitle2)) {
selectWindow(redTitle2);
run("8-bit");
roiManager("Select", 0);
getStatistics(area, mean, min, max, std);
redMean = mean;
close();
}
// 绿通道测量(套用同一 ROI)
if (isOpen(greenTitle1)) {
selectWindow(greenTitle1);
run("8-bit");
roiManager("Select", 0);
getStatistics(area, mean, min, max, std);
greenMean = mean;
close();
} else if (isOpen(greenTitle2)) {
selectWindow(greenTitle2);
run("8-bit");
roiManager("Select", 0);
getStatistics(area, mean, min, max, std);
greenMean = mean;
close();
}
}
// 关闭原图
if (isOpen(title)) close();
// 清空 ROI 管理器,准备下一个文件
roiManager("Reset");
// 计算比值
ratio = NaN;
if (!isNaN(redMean) && !isNaN(greenMean)) {
if (greenMean != 0) ratio = redMean / greenMean;
}
// 写入结果
setResult("Image", count, files[i]);
setResult("RedMean", count, redMean);
setResult("GreenMean", count, greenMean);
setResult("Red/Green", count, ratio);
updateResults();
count++;
}
setBatchMode(false);
// 保存结果为 CSV 到同一文件夹
outPath = dir + "RG_mean.csv";
saveAs("Results", outPath);
// 关闭所有图像窗口
run("Close All");
print("处理完成,共计图像: " + count + "; 结果已保存: " + outPath);
演示一下,将脚本拖入image J:

Macros 🡪 Run Macro,选择图片所在文件夹,点击select即可运行

自动计算所有结果,生成结果文件。
