众所周知,使用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);
}
}