通过 DM 脚本在线轮廓中给定 Y 坐标列出所有 X 坐标
List all X coordinates by given a Y coordinate in a line profiles by DM scripting
对于线轮廓(曲线),我想通过给定此 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)
}
当您使用 min
和 max
时,您的脚本会出错,因为您无法获得单个值的 minimum/maximum(或者更确切地说,它是 总是那个值)。你想做的很可能是:
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)
命令将 return 第 第一个 最大值,所以我得到一个有序列表。
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 包含所有数据作为简单的数组和值(实数或整数)。这些是真实数据,与任何校准无关。如果您在图像状态调色板中关闭“校准”复选框,您会看到这些值:
这些是所有脚本命令等将使用的值,即位置始终是 indices(从 0 开始),值是存储的原始数值。
这些图像或光谱通过为每个维度轴定义原点和比例(和单位)以及强度(=值)来校准。这些值的三元组可以在数据的图像显示信息中找到:
仅在检查“显示校准值”复选框时,是否在校准值中显示的数据。但是,实际值保持不变。仅 scale/origin 值用于转换数字。
如果您想使用脚本来使用校准值,那么您必须自己在脚本中执行相同的转换。
这是示例:
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)
注意空间标定和强度标定的不同标定公式!
对于线轮廓(曲线),我想通过给定此 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)
}
当您使用 min
和 max
时,您的脚本会出错,因为您无法获得单个值的 minimum/maximum(或者更确切地说,它是 总是那个值)。你想做的很可能是:
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)
命令将 return 第 第一个 最大值,所以我得到一个有序列表。
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 包含所有数据作为简单的数组和值(实数或整数)。这些是真实数据,与任何校准无关。如果您在图像状态调色板中关闭“校准”复选框,您会看到这些值:
这些图像或光谱通过为每个维度轴定义原点和比例(和单位)以及强度(=值)来校准。这些值的三元组可以在数据的图像显示信息中找到:
仅在检查“显示校准值”复选框时,是否在校准值中显示的数据。但是,实际值保持不变。仅 scale/origin 值用于转换数字。
如果您想使用脚本来使用校准值,那么您必须自己在脚本中执行相同的转换。 这是示例:
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)
注意空间标定和强度标定的不同标定公式!