如何在不改变数字显微照片中图像校准比例的情况下应用汉宁窗口?

时间:2016-08-19 00:36:22

标签: image-processing filtering dm-script

我想在处理' 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,如下图所示。

enter image description here enter image description here

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

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

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

2 个答案:

答案 0 :(得分:2)

在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中,此脚本使用选择运算符&#39; []&#39;直接访问正面图像选择。此运算符保留原始图像的校准(和标记)信息。

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

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

答案 1 :(得分:1)

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

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

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

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