Как импортировать .csv файл отмеченных точек на Фиджи и поместить его на правильные кусочки - PullRequest
0 голосов
/ 04 октября 2018

Решенная проблема : Как эффективно использовать человека для отметки группы точек в стеке изображений tiff?

  1. Импорт стека изображений в Фиджи
  2. Выберите многоточечный инструмент
  3. Отметьте несколько точек на каждом срезе (срез является изображением из стопки изображений)
  4. Анализ -> Измерение
  5. Файл -> Сохранить как ...-> markss.csv

Первые несколько строк получившегося файла markss.csv показаны ниже.Интерес представляют координаты X и Y каждой точки, их порядок, а также срез каждой точки:

 ,Area,Mean,X,Y,Slice,Counter,Count
1,0,34,240.0,31.0,1,0,200
2,0,133,313.2,120.8,1,0,200
3,0,77,290.2,234.5,1,0,200
4,0,74,314.5,217.2,1,0,200
5,0,120,343.2,230.8,1,0,200
6,0,52,249.2,39.2,2,0,200
7,0,140,309.0,104.8,2,0,200
8,0,88,287.2,232.8,2,0,200
9,0,89,307.0,228.2,2,0,200
10,0,145,332.8,231.2,2,0,200
11,0,190,274.0,62.8,3,0,200
12,0,130,246.5,128.0,3,0,200
13,0,61,186.8,251.5,3,0,200
14,0,33,195.2,239.0,3,0,200
15,0,117,210.0,257.2,3,0,200
16,0,111,245.5,47.2,4,0,200

Нерешенная проблема : Как эффективно использовать человека для настройкимаркировки в существующем файле CSV?

Я пытаюсь импортировать обратно на Фиджи существующий файл .csv, созданный Фиджи, чтобы правильные точки были помещены на правильные срезы в стеке.Цель состоит в том, чтобы пользователь быстро прошел через эти точки, переместил некоторые из них при необходимости, а затем сохранил их обратно в файл .csv.Если есть лучший инструмент для этого, чем Фиджи, пожалуйста, скажите мне.

Свернуть пример Я нашел в Интернете, я попытался реализовать код Python, который будет читать файл CSV, прочитать всеуказывает на текущий срез, поместите их на срез, затем перейдите к следующему срезу и т. д., пока файл не закончится.Я получаю сообщение об ошибке

NameError: name 'makeSelection' is not defined

После нескольких часов поиска в Google, просматривая официальную документацию и API , я полностью озадачен синтаксисомна всех модных языках, на которых можно писать макросы для Фиджи, на этом языке написаны примеры, и, самое главное, как найти класс, к которому принадлежит данная функция , чтобы я мог импортировать ее в свой pythonскрипт

См. мою попытку кода ниже.Он запускается даже без загруженного фрагмента, если вы закомментируете две строки, включая makeSelection и setSlice.Пожалуйста, помогите

import os
from ij.io import OpenDialog
from ij import IJ

########################
# Open file dialog
########################
od = OpenDialog("Select the file to import")
srcDir = od.getDirectory()
if srcDir is None:
    print("Cancelled by user")
else:
    filePathName = os.path.join(srcDir, od.getFileName())

    print("importing from file", filePathName)

    ########################
    # Get data
    ########################
    #text = File.openAsString(fileName).split("\n")
    f = open(filePathName, "r")
    text = f.readlines()

    #these are the column indexes
    header = text[0].rstrip().split(",")
    headerDict = dict([(header[i], i) for i in range(len(header))])
    iX = headerDict["X"]
    iY = headerDict["Y"]
    iSlice = headerDict["Slice"]
    oldSlice = 1

    xLst = []
    yLst = []

    # Loop over all lines
    IJ.getImage().setSlice(1)
    for i in range(1, len(text)):
        lineSplit = text[i].rstrip().split(",");
        x = float(lineSplit[iX])
        y = float(lineSplit[iY])
        sl = int(lineSplit[iSlice])

        # Separate input into slices
        if sl == oldSlice:  
            xLst += [x]
            yLst += [y]
        else:
            print "Reading slice",oldSlice, ":::", xLst, yLst

            # Place selection points on the frame
            makeSelection("point", xLst, yLst);

            # Move to the next frame
            IJ.getImage().setSlice(sl+1)

            # Update point storage
            oldSlice = sl
            xLst = [x]
            yLst = [y]

    # Finish off the last trailing slice
    print "Reading slice",oldSlice, ":::", xLst, yLst

Редактировать : я написал другое решение, теперь использующее формат .ijm.В этом формате, видимо, не нужно ничего импортировать.Создание маркировки работает, но маркировка одинакова для всех срезов, не уникальна для каждого.Понятия не имею, как это исправить.

// ask for a file to be imported
fileName = File.openDialog("Select the file to import");
allText = File.openAsString(fileName);
tmp = split(fileName,".");
// get file format {txt, csv}
posix = tmp[lengthOf(tmp)-1];
// parse text by lines
text = split(allText, "\n");

// define array for points
var xpoints = newArray;
var ypoints = newArray; 

// in case input is in CSV format

print("importing CSV point set...");
//these are the column indexes
hdr = split(text[0]);
iLabel = 0; iX = 3; iY = 4;
// loading and parsing each line
for (i = 1; i < (text.length); i++){
   line = split(text[i],",");
   setOption("ExpandableArrays", true);   
   xpoints[(i-1)%5] = parseInt(line[iX]);
   ypoints[(i-1)%5] = parseInt(line[iY]);
   print("p("+i+") ["+xpoints[(i-1)%5]+"; "+ypoints[(i-1)%5]+"]");
   if (i % 5 == 0) {
      setSlice(i / 5);
      makeSelection("point", xpoints, ypoints);
      xpoints = newArray;
      ypoints = newArray; 
   }
...