如何在不更改数码显微照片中图像的校准比例的情况下应用汉宁 window?

How to apply a Hanning window without changing calibration scale of an image in Digital Micrograph?

我想在处理 'FFT' 之前对图像应用汉宁 window。我找到了 Ruben Bjorge 写的脚本:

number size, sizeX, sizeY, top, left, bottom, right, ii, posX, posY  
image front, hannX, hannY, hann, avg, hannout

front := GetFrontImage();
GetSize(front, sizeX, sizeY);
GetSelection(front, top, left, bottom, right);      

// Create Hanning window.
ii = 1;
hannX := CreateFloatImage("", (right-left), (bottom-top));
hannX = 0;
hannX[0, 0, 1, (right-left)] = 1 - cos( 2 * Pi() * icol / (right-left));
while( ii < (bottom-top) )
{
hannX[ii, 0, 2*ii, (right-left)] = hannX[0, 0, ii, (right-left)];
ii = ii * 2;
}

ii = 1;
hannY := CreateFloatImage("", (right-left), (bottom-top));
hannY = 0;
hannY[0, 0, (bottom-top), 1] = 1 - cos( 2 * Pi() * irow / (bottom-top));
while( ii < (right-left) )
{
hannY[0, ii, (bottom-top), 2*ii] = hannY[0, 0, (bottom-top), ii];
ii = ii * 2;
}

hann = hannX * hannY;

// Subtract average from image.
avg = front - Average(front);

// Multiply with Hanning window.
hannout = avg[top, left, bottom, right] * hann;

// Do fast Fourier transform and display image.
fft = RealFFT(hannout);

通过使用这个脚本,FFT的校准标度改为1。但应该是0.11948,如下图所示。

我的问题是: 有没有办法在不改变图像校准比例的情况下应用汉宁window?

或者如何根据原始图像的比例计算FFT图像的比例?

由于脚本的其余部分需要 fft 图像的正确比例,如果有人能回答这个长问题,我将不胜感激。谢谢

您的主要问题是关于在 DM 图像对象上执行数学运算时校准信息的传播。简短的回答是,当使用带有等号的简单分配时,此类信息以及附加到图像的所有标签数据不会传输到结果图像。每个这样的图像表达式都有效地分配了一个新的真实图像(没有校准、标签或名称),并且只有它的像素值被传输到结果图像(默认情况下也是一个未校准、未命名的真实图像)。

有几种方法可以让这个脚本更简单有效地做你想做的事情(我会 post 第二个答案来证明这一点),但获得所需结果的最小变化是替换最后一行包含以下三行:

ImageCopyCalibrationFrom(hannout, front);
Image fft := RealFFT(hannout);
ShowImage(fft);

第一行将校准从原始正面图像转移到您实际需要校准傅里叶变换的过滤图像。第二行使用“:=”运算符让图像变量 'fft' 直接指向 RealFFT 函数的输出,从而保留其校准信息。换句话说,这是通过引用分配,而不是图像表达式,它绕过了中间和最终结果的默认(未校准)真实图像分配。第三行实际显示了结果(您的示例代码中似乎缺少该结果)。

在 DM 图像表达式中保留校准信息的关键是尽可能多地使用图像引用和对图像对象的克隆进行就地操作。当您将示例脚本转换为使用此类技术时,您的示例脚本将变得更加简单和高效,如下所示:

Image frontImage := GetFrontImage();

// Step 1 - extract and get info about the front image selection
Image frontSelection := frontImage[];
Number selW = ImageGetDimensionSize(frontSelection, 0);
Number selH = ImageGetDimensionSize(frontSelection, 1);

// Step 2 - subtract average value from selection and apply Hanning window
Image filteredSelection := ImageClone(frontSelection);
filteredSelection -= Average(frontSelection);
filteredSelection *= (1 - cos(2 * Pi() * icol / selW));
filteredSelection *= (1 - cos(2 * Pi() * irow / selH));
String selectionName = ImageGetName(frontImage) + " filtered selection";
ImageSetName(filteredSelection, selectionName);

// Step 3 - take FFT of filtered selection and display result
Image filteredFFT := RealFFT(filteredSelection);
ShowImage(filteredFFT);

此处的主要区别在于标记为步骤 1 和步骤 2 的两个部分。

在第 1 步中,此脚本使用选择运算符“[ ]”直接访问正面图像选择。此运算符保留原始图像的校准(和标签)信息。

在第 2 步中,ImageClone 函数制作了选区图像对象的完整副本,包括其校准(和标签)数据。接下来的三行直接在克隆的选择上进行数学处理。请特别注意,Hanning window 因子的应用非常简单,单个图像表达式会自动应用于结果图像的所有像素。示例脚本中不需要使用 while 循环。除了增加代码复杂性之外,这些比单行图像表达式完成的隐含循环要慢得多。事实上,Hanning window 可以应用在包含 x 和 y 依赖因子的单行中,如下所示:

filteredSelection *= (1-cos(2*Pi() * icol/selW)) * (1-cos(2*Pi() * irow/selH));