如何从数据集中任意提取特定图像子集?DM脚本实现图像栈切片提取
没问题!用DM脚本完全能搞定这个需求,我给你准备了几个实用的脚本方案,覆盖你提到的所有场景:
1. 提取偶数/奇数索引切片
这个脚本可以快速分离图像栈里的偶数或奇数索引切片(注意:这里的索引从0开始,也就是DM界面里显示的第1个切片对应索引0)。
// 提取偶数索引切片(索引从0开始) void ExtractEvenSlices(ImageStack sourceStack) { number sliceCount = sourceStack.ImageCount(); ImageStack destStack := NewImageStack("Even Slices", sourceStack.ImageWidth(), sourceStack.ImageHeight(), 0); for (number i=0; i<sliceCount; i+=2) { Image slice := sourceStack.Image(i); destStack.AddImage(slice.ImageClone()); } destStack.ShowImage(); destStack.SaveAs("Even_Slices.dm4"); // 按需修改保存路径和格式 } // 提取奇数索引切片(索引从0开始) void ExtractOddSlices(ImageStack sourceStack) { number sliceCount = sourceStack.ImageCount(); ImageStack destStack := NewImageStack("Odd Slices", sourceStack.ImageWidth(), sourceStack.ImageHeight(), 0); for (number i=1; i<sliceCount; i+=2) { Image slice := sourceStack.Image(i); destStack.AddImage(slice.ImageClone()); } destStack.ShowImage(); destStack.SaveAs("Odd_Slices.dm4"); // 按需修改保存路径和格式 } // 使用示例:选中源图像栈后运行 ImageStack source = GetFrontImage(); if (source.ImageCount() > 0) { ExtractEvenSlices(source); // ExtractOddSlices(source); // 切换注释来提取奇数切片 } else { OKDialog("请先选中一个图像栈!"); }
使用方法:
- 打开你的图像栈并选中它
- 把脚本粘贴到DM的脚本编辑器里
- 运行脚本,默认提取偶数切片;如果要提取奇数切片,注释掉
ExtractEvenSlices(source),取消注释ExtractOddSlices(source)即可 - 脚本会自动生成新的图像栈并显示,同时保存为指定格式的文件(你可以修改
SaveAs里的路径和文件名)
2. 提取任意指定索引的切片
如果需要提取非规律的切片(比如第3、5、8个切片),可以用下面的脚本,它支持手动输入要提取的索引列表:
// 提取任意指定索引的切片(索引从0开始,用逗号分隔) void ExtractCustomSlices(ImageStack sourceStack, string indexStr) { number sliceCount = sourceStack.ImageCount(); TagGroup indexList = NewTagGroup(); indexList.TagGroupLoadIndexedTagsFromString(indexStr); ImageStack destStack := NewImageStack("Custom Slices", sourceStack.ImageWidth(), sourceStack.ImageHeight(), 0); for (number i=0; i<indexList.TagGroupCountTags(); i++) { number idx; if (indexList.TagGroupGetIndexedTagAsNumber(i, idx) && idx >=0 && idx < sliceCount) { Image slice := sourceStack.Image(idx); destStack.AddImage(slice.ImageClone()); } else { OKDialog("索引 " + idx + " 无效,已跳过!"); } } destStack.ShowImage(); destStack.SaveAs("Custom_Slices.dm4"); // 按需修改保存路径和格式 } // 使用示例:选中源图像栈后运行,输入索引列表 ImageStack source = GetFrontImage(); if (source.ImageCount() > 0) { string input = InputDialog("请输入要提取的切片索引(从0开始,逗号分隔):", "2,5,7,10"); if (input != "") { ExtractCustomSlices(source, input); } } else { OKDialog("请先选中一个图像栈!"); }
使用方法:
- 选中源图像栈后运行脚本
- 在弹出的对话框里输入要提取的索引,比如
2,5,7(对应DM里的第3、6、8个切片) - 脚本会自动过滤无效索引,生成新的图像栈并保存
一些额外提示
- 如果你需要批量处理多个图像栈,可以在脚本里添加循环遍历所有打开的图像的逻辑
- 保存格式支持DM支持的所有格式,比如
.tif、.png等,只要修改SaveAs里的后缀即可 - 脚本里的
ImageClone()是为了避免修改原图像栈,如果你不需要保留原数据,可以直接用destStack.AddImage(slice)(但不推荐)
内容的提问来源于stack exchange,提问作者DM Adventurer
相关产品推荐
相关产品推荐

