我目前正在开发 DigitalMicrograph (DM) 脚本中的边缘检测功能。我已经有两个简单的实现来使用内在变量计算一阶和二阶导数,如下所示:
一阶导数:
Image absolute_first_derivative(Image in)
{
Number size_x, size_y, origin, scale;
String units;
Image out;
in.ImageGetDimensionCalibration(0, origin, scale, units, 0);
in.GetSize(size_x, size_y);
if (size_y != 1) Result("Only compatible with 1D image");
out := RealImage("first_derivative", 4, size_x, size_y);
out = in[icol + 1, irow] - in[icol, irow];
out[0, 0] = 0;
out[size_x - 1, 0] = 0;
out.ImageSetDimensionCalibration(0, origin, scale, units, 0);
return out;
}
二阶导数:
Image second_derivative(Image in)
{
Number size_x, size_y, origin, scale;
String units;
Image out;
in.ImageGetDimensionCalibration(0, origin, scale, units, 0);
in.GetSize(size_x, size_y);
if (size_y != 1) Result("Only compatible with 1D image");
out := RealImage("second_derivative", 4, size_x, size_y);
out = in[icol + 1, irow] - 2 * in[icol, irow] + in[icol - 1, irow];
out[0, 0] = 0;
out[size_x - 1, 0] = 0;
out.ImageSetDimensionCalibration(0, origin, scale, units, 0);
return out;
}
我想使用Warp()
DM 提供的函数实现更灵活的基于内核的方法(例如 Sobel、LoG 或类似内核)。但是,它似乎Warp()
是专门为 2D 图像转换而设计的。
我的问题是:
Warp()
DigitalMicrograph 脚本是否可以改编或用于一维图像处理?- 如果
Warp()
不合适,是否有其他内置 DM 函数或推荐的方法来执行基于核的卷积或专门对一维图像进行的变换?
任何建议或例子都将不胜感激!
Warp() 函数的主要目的是对现有数据数组或图像进行插值,因此,它的使用似乎次于您对 1D 数据数组进行基于内核的过滤的主要目标。因此,这个答案分两个阶段来回答你的问题。
第一阶段只是执行基于核的计算。这可以通过 DM Convolution() 函数轻松实现,如以下示例所示,该示例将平滑的一阶导数核应用于某些目标数据:
不幸的是,DM 帮助文档没有详细介绍 Convolution() 函数,但在脚本>示例脚本>简单图像计算>图像过滤部分提供了一些示例脚本和其他图像过滤函数。
如果您在 StackOverflow 中搜索“[dm-script] Convolution”,您会发现其他一些帖子也涉及此功能及其相关函数在 DM 脚本中的使用。
至于您想使用 Warp() 函数,这似乎是一个单独的问题,因为它的目的主要是在数组中插入值,这可以在应用卷积函数之前或之后完成。如果您对 Warp 还有疑问,请将其作为单独的帖子。