首页 > 解决方案 > 通过 DM 脚本在直线轮廓中给定一个 Y 坐标,列出所有 X 坐标

问题描述

对于线轮廓(曲线),我想通过给定这个 Y 坐标来达到该列表对应于 Y 坐标的所有 X 坐标。我可以得到这些 x 坐标的最小值和最大值。这里假设我想列出所有对应 y=8 的 X 坐标,这是正确的还是其他更好的方法?谢谢

 Number minx, maxx
    Image front=:getfrontimage()

    GetSize( front, xsize, ysize )

    for (i=0; i<xsize; i++)

                {
                    x= getpixel(front, i, 8)
                 minx=min(x)
          maxx=max(x)

                }

标签: dm-script

解决方案


当您使用minand时,您的脚本会出错max,因为您无法获得单个值的最小值/最大值(或者更确切地说,它始终是该值)。您想要做的可能是:

image spec := RealImage("Test",4,100)
spec = trunc(Random()*10)
number v = 8

ClearResults()
number nCh = spec.ImageGetDimensionSize(0)
for( number i=0; i<nCh; i++)
{
    if( v == sum(spec[i,0]) )
        Result("\n Value "+ v +" @ " + i )
}

sum()这里需要一个将图像表达式转换为单个值的技巧。)


但是,在脚本中逐像素进行可能会很慢。只要有可能,尝试使用图像表达式进行编码,因为它们更快(对于大图像)。因此,我经常使用一个技巧:我为我搜索的值设置一个图像阈值,然后迭代该掩码,只要它不是全零即可。如果有多个,该max(img,x,y)命令将返回第一个最大值,因此我得到一个有序列表。

image spec := RealImage("Test",4,100)
spec = trunc(Random()*10)
spec.ShowImage()

number v = 8
image mask = (spec==v)?1:0

ClearResults()
while( 0<sum(mask) )
{
    number x,y
    max(mask,x,y)
    Result("\n Value " + v +" @ " + x )
    mask[x,0]=0
}

编辑:回答下面评论的问题。

这就是人们如何从校准值的线轮廓中获得 ZLP 最大值(位置和值)。

前体:DM 包含所有数据作为简单的数组和值(实数或整数)。这些是真实数据,与任何校准无关。如果您在图像状态面板中关闭“校准”复选框,您会看到这些值: 未校准的显示 这些是所有脚本命令等将使用的值,即位置始终是索引(从 0 开始),值是存储的原始数值。

这些图像或光谱通过定义每个维度轴的原点和比例(和单位)以及强度(=值)来校准。这些值的三元组可以在数据的图像显示信息中找到: 校准值

只有选中“显示校准值”复选框时,数据才会以校准值显示。但是,实际值保持不变。仅使用比例/原点值来转换数字。 校准值

如果您想使用脚本来使用校准值,那么您必须自己在脚本中执行相同的转换。这是示例:

image spectrum := GetFrontImage()

number xScale = spectrum.ImageGetDimensionScale(0)  // 0 for X dimension
number xOrigin = spectrum.ImageGetDimensionOrigin(0)
string xUnit = spectrum.ImageGetDimensionUnitString(0)

number iScale = spectrum.ImageGetIntensityScale()
number iOrigin = spectrum.ImageGetIntensityOrigin()
string iUnit = spectrum.ImageGetIntensityUnitString()

string info = "\n"
info += "Image ["+spectrum.ImageGetLabel()+"]:"
info += "\n\t Dimension calibration: nCh * " + xScale + " + " + xOrigin + " [" + xUnit + "]"
info += "\n\t Intensity calibration: (value - " + iOrigin + ") * " + iScale +" [" + iUnit + "]"
Result(info)

// Find ZLP maximum (uncalibrated values)
number maxP_ch, dummy, maxV_raw
maxV_raw = max(spectrum,maxP_ch,dummy)
info = "\n"
info += "\n\t The maximum position is at channel index: " + maxP_ch 
info += "\n\t The maximum Value at maximum position is: " + maxV_raw 
Result(info)

number maxP_cal = xOrigin + xScale * maxP_ch
number maxV_cal = (maxV_raw - iOrigin) * iScale
info = "\n"
info += "\n\t The maximum position is at : " + maxP_cal
info += "\n\t The maximum Value is       : " + maxV_cal 
Result(info)

注意尺寸校准和强度校准之间的不同校准公式!


推荐阅读