Posted on

在进行免疫荧光多重荧光分析时,有时候需要分析两个荧光信号的比值。其实单个图片分析的方法很简单,基本逻辑就是通道拆分🡪分别对两个荧光图进行平均荧光强度分析🡪计算比值。以下图为例,我来给大家演示。

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即可运行

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

发表评论

邮箱地址不会被公开。 必填项已用*标注