1

我非常喜欢 DigitalMicrograph 中的 tert() 命令,但其中有一些我不明白的地方。考虑测试脚本:

image test:= realimage("",4,100,1);
number value1 = 1;
number value2 = 0.1;
if(value2==0.1) result("\nvalue2 really equals 0.1");
test.setPixel(5,0,value1);
test.setPixel(10,0,value2);

image mask = imageclone(test);
mask = 0;
mask = tert(test==value1,1,mask);
mask = tert(test==value2,1,mask);
mask.showimage()

该脚本找到“test”数组等于 value1 的像素,但没有找到 value2 的像素。似乎 tert 命令仅在“值”是整数时才理解条件(test == value)。否则,它认为等价不是 EXACT。这很奇怪,因为数字 Value2 被隐含地(我假设)定义为实数,然后分配给实数数组。DigitalMicrograph 如何确定值是整数/实数/双精度数?

4

1 回答 1

1

您在此处观察到的是比较浮点值时的典型问题,而不允许对浮点表示的有限精度进行小但非零的容差。在您的特定测试脚本中,出现问题是因为 DMS 中的数字值始终是双精度的,因此您有效地将测试图像中的 4 字节浮点值与存储在数字对象中的 8 字节浮点值进行比较。如果您更改第一行以使用 8 字节浮点值分配测试图像,您的脚本将正确找到这两个值,如下所示:

image test:= realimage("",8,100,1);

另一方面,更稳健的解决方案是在比较“相等”的浮点值时使用小的非零容差。具体来说,如果您按如下方式更改调用 tert 函数的脚本的测试行,那么它也会正确找到这两个值:

mask = tert(Abs((test-value1)/value1)<1e-7,1,mask);
mask = tert(Abs((test-value2)/value2)<1e-7,1,mask);
于 2016-05-18T21:48:33.530 回答