ImageJ批量切割大型.CZI格式图片

众所周知,使用ImageJ的bio-formats插件可以打开.czi格式的图片。然而,有时候.czi格式图片可能太大了,以至于超出了java所能处理图像的最大尺寸(大约是46340 x 46340),于是会报出超出内存的错误。这里其实不是超出了计算机的实际内存,而是超出了java语言对数组长度的限制,所以换一台内存大的电脑也没用,照样打不开。

但是好在czi格式的文件支持“按需读取”。“按需读取”意思就是不加载整个图片,而只是把图片的小片区域读取到内存当中。通过这样的方法,我们就可以将czi图片分区域进行读取并另存为TIFF,实现切割的效果。

手动“按需读取”:

关于imagej如何安装bio-formats插件请自行百度,此处不再赘述。

只要依次点击Plugins→Bio-Formats→Bio-Formats Importer,选择你的.czi格式文件,然后勾选Crop on import(如下图)

之后选择一个series,就会弹出Bio-Formats Crop Options窗口(如下图)。前两个参数是需要读取的起始像素坐标,坐标零点是图片左上角,向右x增加,向下y增加。后两个参数是需要读取的总长度和总高度。例如你只需要读取czi格式图片左上角1000*1000像素区域的图片,四个参数则分别填写0,0,1000,1000即可。

批量切割

如果你有很多张.czi格式图片需要进行切割,并且每一张都非常大,那么你可以将这些图片放进同一个文件夹中,然后使用以下方法来进行批量切割。下面的方法会为每一张czi图片创建一个文件夹,并且以图片名作为文件夹名称,然后将切割下来的小图放进对应文件夹中。小图的命名方式为:小图左上角第一个像素对应的原图像素在原图中的行坐标和列坐标。

1,请确保你已经安装了bio-formats插件。或者直接使用Fiji(强烈建议)。

2,请新建一个txt文本文档,并将下面的代码拷贝进去。

3,按照实际情况修改前几行代码中的参数并保存。

4,打开ImageJ,点击Plugins→Macros→Edit...,选择刚才保存的文本文件并打开。

5,在弹出的窗口中,点击Macros→Run Macro。如有疑问欢迎加博主微信w2689115745交流

6,由于大图高度和宽度可能与小图高度和宽度之间可能不是整除关系,因此最后一行和最后一列小图可能会小于设定的宽度和高度。但所有小图可刚好拼成大图。

run("Bio-Formats Macro Extensions");
//请设定大图参数:
series=1//设定series
InputPath="C:/Users/我是胡锦州/Desktop/1CHANNEL/"; //设定大图所在目录,注意windows系统的话需要将目录中所有 反斜杠“\” 改成 斜杠“/” ,此外最后一个斜杠不能省略


//请设定切割后的小图参数
setWidth=4096; //设定小图宽度像素数
setHeight=4096; //设定小图高度像素数
overlap=0; //设定小图之间重叠的像素数
fmat="TIFF"; //设定小图的格式,一般与原图格式相同即可
OutputPath="C:/Users/我是胡锦州/Desktop/322/out/";//设定切割后的小图所在目录,注意事项同上


//以下代码无需更改
X=0;
Y=0;
list = getFileList(InputPath);
for (i = 0; i < list.length; i++) {
    if (endsWith(list[i], ".czi")) {
        print("\\Update0:大图共"+list.length+"张,正在切割第"+i+1+"张");
        //获取大图宽高信息
        Ext.setId( InputPath+list[i] );
        Ext.getSizeX(picWidth);
        Ext.getSizeY(picHeight);
        //计算小图数量
        xnum=floor(picWidth/setWidth)+(picWidth%setWidth>0);
        ynum=floor(picHeight/setHeight)+(picHeight%setHeight>0);
        picnum=xnum*ynum;
        //以图片名创建文件夹
        name1 = list[i];
        suffixPosition = lastIndexOf(name1, ".czi");
        if (suffixPosition > 0) {
            name1 = substring(name1, 0, suffixPosition);
        }
        newDir = OutputPath + name1 + "/";
        File.makeDirectory(newDir);
        process=0;
        for(X=0; X+setWidth<picWidth; X=X+setWidth-overlap)
        {
            for(Y=0; Y+setHeight<picHeight; Y=Y+setHeight-overlap)//遍历小图
            {
                run("Bio-Formats Importer", "open=" + InputPath + list[i] + " autoscale color_mode=Default crop rois_import=[ROI manager] view=Hyperstack stack_order=XYCZT series_&series x_coordinate_1=&X y_coordinate_1=&Y width_1=&setWidth height_1=&setHeight");
                saveAs(fmat, newDir+Y+","+X);
                close();
                process=process+1;
                print("\\Update2:当前正在切割:"+list[i]);
                print("\\Update3:"+process+"/"+picnum);
            }
        }
        
        fitWidth=picWidth-X+1;//重设最后一列小图宽度
        for(Y=0; Y+setHeight<picHeight; Y=Y+setHeight-overlap)
        {
            run("Bio-Formats Importer", "open=" + InputPath + list[i] + " autoscale color_mode=Default crop rois_import=[ROI manager] view=Hyperstack stack_order=XYCZT series_&series x_coordinate_1=&X y_coordinate_1=&Y width_1=&fitWidth height_1=&setHeight");
            saveAs(fmat, newDir+Y+","+X);
            close();
            process=process+1;
            print("\\Update2:当前正在切割:"+list[i]);
            print("\\Update3:"+process+"/"+picnum);
        }
        
        fitHeight=picHeight-Y+1;//重设最后一行小图宽度
        for(X=0; X+setWidth<picWidth; X=X+setWidth-overlap)
        {
            run("Bio-Formats Importer", "open=" + InputPath + list[i] + " autoscale color_mode=Default crop rois_import=[ROI manager] view=Hyperstack stack_order=XYCZT series_&series x_coordinate_1=&X y_coordinate_1=&Y width_1=&setWidth height_1=&fitHeight");
            saveAs(fmat, newDir+Y+","+X);
            close();
            process=process+1;
            print("\\Update2:当前正在切割:"+list[i]);
            print("\\Update3:"+process+"/"+picnum);
        }
        
        run("Bio-Formats Importer", "open=" + InputPath + list[i] + " autoscale color_mode=Default crop rois_import=[ROI manager] view=Hyperstack stack_order=XYCZT series_&series x_coordinate_1=&X y_coordinate_1=&Y width_1=&fitWidth height_1=&fitHeight");
        saveAs(fmat, newDir+Y+","+X);
        close();
        process=process+1;
        print("\\Update2:当前正在切割:"+list[i]);
        print("\\Update3:"+process+"/"+picnum);
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值