2015-10-10 7 views
1

Есть ли команда сценария, в которой я могу указать конкретный срез в LinePlotImageDisplay и выполнить горизонтальное выравнивание по горизонтали путем калибровки (или некалиброванных (каналов))?Команда скрипта для выравнивания среза по горизонтали с помощью калибровки

ответ

1

Нет, для достижения этого выравнивания нет единой команды «удобства». Вам нужно будет самостоятельно создать соответствующую функцию, прочитав калибровку срезов и установив свою систему координат дисплея. Вы можете найти следующее (старый) учебник PDF на главной странице FELMI может быть полезно:

SlicesInLinePlotDisplay.pdf


В следующем примере сценарий также может быть полезным. Он показывает, как один срез выровнен относительно другого фрагмента. (Только на оси Х)

// All Slices in a LinePlot are grouped into a single 'group' 
// Slices can be moved relative to each other by specifying their image-to-group transform, 
// and the whole image (i.e. the group) can be moved with respect to the display using the group-to-display transform. 
// To set the image-to-group transform of the slice specified by 'slice_id', with respect to the slice specified by 'ref_id' 
// use the command: 
// LinePlotImageDisplaySetImageToGroupTransform(LinePlotImageDisplay lpid, ScriptObject slice_id, ScriptObject ref_id, double off_val, double scale_val, double off_dim_0, double scale_dim_0) 

/*********************************************************/ 
// Create 2 LinePlots and add them into one display 
// (Initially they are aligned by their calibrations) 
number sc1 = 1 
number of1 = -50 
number sc2 = 2 
number of2 = -20 

image sl1 := realImage("S1",4,300) 
image sl2 := realImage("S2",4,300) 
sl1 = (iwidth-icol)/iwidth 
sl2 = (iwidth-icol)/iwidth 
sl1[0,50,1,60] = 1 
sl1[0,250,1,260] = 1 
sl2[0,10,1,15] = 1 
sl2[0,110,1,115] = 1 
// Adding Calibrations 
sl1.ImageSetDimensionCalibration(0,of1,sc1,"CH",0) 
sl2.ImageSetDimensionCalibration(0,of2,sc2,"CH",0) 

sl1.DisplayAt(20,30) 
sl2.DisplayAt(750,30) 
OKDialog("Put into one Display") 

imageDisplay disp = sl1.ImageGetImageDisplay(0) 
disp.ImageDisplayAddImage(sl2, "S2")      // When added like this, the slices are automatically aligned by their respective calibration! 
disp.LinePlotImageDisplaySetDoAutoSurvey(0, 0) 
object ref_id = disp.ImageDisplayGetSliceIDByIndex(0)  // Slice 0 
object slice_id = disp.ImageDisplayGetSliceIDByIndex(1)  // Slice 1 

OKDialog("Now align by channels (i.e. undo any relative sclice alignment)") 
// Simply set the relative "shifts" and "scales" to 0 and 1. 
disp.LinePlotImageDisplaySetImageToGroupTransform(slice_id, ref_id, 0, 1, 0, 1) 

OKDialog("Now align by chalibration ") 
number relScale = sc2/sc1 
number relOff = of2-of1 
disp.LinePlotImageDisplaySetImageToGroupTransform(slice_id, ref_id, 0, 1, relOff, relScale) 
+0

Угадайте, что нет простого выхода, но нужно построить собственный скрипт. Существует одна незначительная "ловушка" в коде примера, что мы должны быть осторожными: номер reloff = of2-OF1 должен быть число reloff = (of2-OF1)/sc1 Спасибо! – KEVIVI

+0

@KEVIVI Правильно, спасибо. Мне нравится ваш «полный сценарий» ниже - нужно загрузить его в базу данных FELMI? – BmyGuest

2

Следующая scipt является полной имплантации на основе примеров кодов, предоставляемых BmyGuest. Он выравнивает все срезы в LinePlotImageDisplay горизонтально либо путем калибровки, либо по каналу (т. Е. Не откалиброван).

class SliceAlignment : object { 
    number true, false;  // boolean 
    image imgLPID; 
    imageDisplay LPID;  // line plot image display 

number CalculateImageToGroupTransformFactors(object self, image slice_src, image slice_ref, number &relOff, number &relScale) { 
    number origin_ref, scale_ref, origin_src, scale_src; 
    string unit_ref, unit_src; 
    number calFMT = 0;   // origin is expressed in calibrated unit 
    // 
    slice_src.ImageGetDimensionCalibration(0, origin_src, scale_src, unit_src, calFMT); 
    slice_ref.ImageGetDimensionCalibration(0, origin_ref, scale_ref, unit_ref, calFMT); 
    // 
    relScale = scale_src/scale_ref; 
    relOff = (origin_src - origin_ref)/scale_ref ; 
    // check if both images are calibrated in same unit 
    if(unit_src != unit_ref) return false 
    return true; 
}; 

void AlignNthSliceHorizontallyByChannel(object self, number slice_idx) { 
    // get current reference slice index 
    number refSlice_idx = LPID.LinePlotImageDisplayGetSlice(); 
    // get slice ID's (as objects) 
    object slice_ref = LPID.ImageDisplayGetSliceIDByIndex(refSlice_idx); 
    object slice_src = LPID.ImageDisplayGetSliceIDByIndex(slice_idx); 
    number int_offset = 0, int_scale = 1.0;   // vertical (intensity) offset and scaling factors 
    number pos_offset = 0, pos_scale = 1.0;   // horizontal (position) offset and scaling factors 
    LPID.LinePlotImageDisplaySetImageToGroupTransform(slice_src, slice_ref, int_offset, int_scale, pos_offset, pos_scale); 
}; 

void AlignNthSliceHorizontallyByCalibration(object self, number slice_idx) { 
    // get current reference slice index 
    number refSlice_idx = LPID.LinePlotImageDisplayGetSlice(); 
    // get slice ID's (as objects) 
    object slice_ref = LPID.ImageDisplayGetSliceIDByIndex(refSlice_idx); 
    object slice_src = LPID.ImageDisplayGetSliceIDByIndex(slice_idx); 
    number int_offset = 0, int_scale = 1.0;   // vertical (intensity) offset and scaling factors 
    number pos_offset, pos_scale;     // horizontal (position) offset and scaling factors 
    number unit_check = self.CalculateImageToGroupTransformFactors(imgLPID{slice_idx}, imgLPID{refSlice_idx}, pos_offset, pos_scale); 
    if(unit_check == false) { 
     string prompt = "slice #" + slice_idx + " [" + LPID.ImageDisplayGetSliceLabelById(LPID.ImageDisplayGetSliceIDByIndex(slice_idx)) + "] is calibrated in different unit!"; 
     if(!ContinueCancelDialog(prompt)) return 
    }; 
    LPID.LinePlotImageDisplaySetImageToGroupTransform(slice_src, slice_ref, int_offset, int_scale, pos_offset, pos_scale); 
    return; 
}; 

void AlignAllSlicesHorizontallyByChannel(object self) { 
    number nSlices = LPID.LinePlotImageDisplayCountSlices(); 
    for(number idx = 0; idx < nSlices; idx++) self.AlignNthSliceHorizontallyByChannel(idx); 
    return; 
}; 

void AlignAllSlicesHorizontallyByCalibration(object self) { 
    number nSlices = LPID.LinePlotImageDisplayCountSlices(); 
    for(number idx = 0; idx < nSlices; idx++) self.AlignNthSliceHorizontallyByCalibration(idx); 
    return; 
}; 

object init(object self, image img) { 
    // check if the image display is correct type 
    imgLPID := img; 
    LPID = imgLPID.ImageGetImageDisplay(0); 
    if(LPID.ImageDisplayGetDisplayType() != 3) throw("Please choose a valid line plot display"); 
    return self; 
}; 

SliceAlignment(object self) { 
    true = 1; false = 0; 
    result("SliceAlignment [obj ID:" + self.ScriptObjectGetID().hex() + "] constructured\n"); 
}; 

~SliceAlignment(object self) { 
    result("SliceAlignment [obj ID:" + self.ScriptObjectGetID().hex() + "] destructured\n\n"); 
}; }; 

{; object objAlign = alloc(SliceAlignment); 
objAlign.init(GetFrontImage()); 
if(OptionDown()) objAlign.AlignAllSlicesHorizontallyByChannel(); 
else objAlign.AlignAllSlicesHorizontallyByCalibration(); };