Перечислите все координаты X по заданной координате Y в профилях линий с помощью сценариев DM - PullRequest
0 голосов
/ 16 февраля 2020

Для профиля линии (кривой) я хочу получить в этом списке все координаты X, соответствующие координате Y, по данной координате Y. И я мог бы получить минимальное и максимальное значения этих координат х. Здесь предполагается, что я хочу перечислить все координаты X, соответствующие y = 8, это правильно или любой другой лучший способ? Thx

 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)

                }

1 Ответ

1 голос
/ 17 февраля 2020

Ваш скрипт становится неправильным, когда вы используете 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 содержит все данные в виде простых массивов и значений (действительных или целых) , Это реальные данные, не связанные с калибровками. Эти значения отображаются, если вы снимаете флажок «калибровка» в палитре «Состояние изображения»: Uncalibrated display Это значения всех команд сценария et c. будет использоваться, т.е. позиции всегда будут , индексы (начиная с 0), а значения будут храниться в виде необработанных чисел c.

Эти изображения или спектры калибруются путем определения источника и масштаба ( и единица измерения) для каждой размерной оси, а также интенсивности (= значение). Эти триплеты значений можно найти в информации об отображении данных: Calibration values

Только когда установлен флажок «Показать калиброванные значения», отображаются данные в калиброванных значениях. Однако реальные значения остаются неизменными. Просто значения масштаба / происхождения используются для преобразования чисел. Calibrated values

Если вы хотите использовать сценарий для использования калиброванных значений, то вы должны выполнить те же преобразования в своем сценарии самостоятельно. Вот пример:

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)

Обратите внимание на различные формулы калибровки между калибровкой размеров и калибровкой интенсивности!

...