Ваш скрипт становится неправильным, когда вы используете min
и 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)
вернет максимум first , если их несколько, поэтому я получаю упорядоченный список.
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
}
Edit: отвечая на вопрос комментария ниже.
Вот как можно получить максимум ZLP (положение и значение) из профиля линии в калиброванных значениях.
Предшественник: DM содержит все данные в виде простых массивов и значений (действительных или целых) , Это реальные данные, не связанные с калибровками. Эти значения отображаются, если вы снимаете флажок «калибровка» в палитре «Состояние изображения»: Это значения всех команд сценария et c. будет использоваться, т.е. позиции всегда будут , индексы (начиная с 0), а значения будут храниться в виде необработанных чисел c.
Эти изображения или спектры калибруются путем определения источника и масштаба ( и единица измерения) для каждой размерной оси, а также интенсивности (= значение). Эти триплеты значений можно найти в информации об отображении данных:
Только когда установлен флажок «Показать калиброванные значения», отображаются данные в калиброванных значениях. Однако реальные значения остаются неизменными. Просто значения масштаба / происхождения используются для преобразования чисел.
Если вы хотите использовать сценарий для использования калиброванных значений, то вы должны выполнить те же преобразования в своем сценарии самостоятельно. Вот пример:
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)
Обратите внимание на различные формулы калибровки между калибровкой размеров и калибровкой интенсивности!