2

我想在处理“FFT”之前将汉宁窗口应用于图像。我找到了 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,如下图所示。

在此处输入图像描述 在此处输入图像描述

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

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

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

4

2 回答 2

3

在 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 函数会生成所选图像对象的完整副本,包括其校准(和标签)数据。接下来的三行直接在克隆的选择上进行数学处理。请特别注意,汉宁窗因子的应用非常简单,只需一个图像表达式即可自动应用于结果图像的所有像素。示例脚本中不需要使用 while 循环。除了增加代码复杂性之外,这些比单行图像表达式完成的隐含循环要慢得多。事实上,汉宁窗可以在包含 x 和 y 相关因子的单行中应用,如下所示:

filteredSelection *= (1-cos(2*Pi() * icol/selW)) * (1-cos(2*Pi() * irow/selH));
于 2016-08-19T19:45:28.120 回答
1

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

有几种方法可以使此脚本更简单有效地执行您想要的操作(我将发布第二个答案来说明这一点),但获得所需结果的最小更改是将最后一行替换为以下三行:

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

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

于 2016-08-19T19:01:17.513 回答