Решенная проблема : Как эффективно использовать человека для отметки группы точек в стеке изображений tiff?
- Импорт стека изображений в Фиджи
- Выберите многоточечный инструмент
- Отметьте несколько точек на каждом срезе (срез является изображением из стопки изображений)
- Анализ -> Измерение
- Файл -> Сохранить как ...-> 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;
}