Как записать файл csv из результатов после некоторой статистики с помощью макроса ImageJ?

После некоторой обработки изображения с использованием макроса ImgaeJ у меня есть вкладка «Результаты», которая содержит 2 столбца A и B. Допустим, у меня есть 50 строк данных.

Теперь я хочу вычесть значение последней строки из всех остальных 49 строк выше в столбце B.

После этого я хочу записать все значения в файл «.csv» (столбцы A, B и C по 49 значений в каждом).

Ниже приведена часть кода. Я думаю, что единственная проблема заключается в извлечении значений из массивов, которые скрипт может записать в файл csv.

Команда Array.getStatistics экспортирует только средние стандартные значения для данного столбца. Меня интересует получение всех 49 значений.

directory = getDirectory("Choose a Directory");
resultFilename = directory + Dialog.getString() + ".csv";

A = newArray(nResults() - 1);
B = newArray(nResults() - 1);

D = getResult("B", nResults() - 1);
    
for (i = 0; i < nResults() - 2; i++) {
    A[i] = getResult("A", i);
    B[i] = getResult("B", i);
    C[i] = A[i] - D;
}

Любая идея о том, что такое команда для получения значений A[i], B[i] и C[i]?

Ждем помощи здесь.

Спасибо.


person Novice_123    schedule 07.03.2021    source источник


Ответы (1)


Одним из решений является запись в файл по мере выполнения вычислений. Я изменил ваш пример (непроверенный), чтобы показать, как это работает.

directory = getDirectory("Choose a Directory");
resultFilename = directory + Dialog.getString() + ".csv";
f = File.open(resultFilename);

A = newArray(nResults() - 1);
B = newArray(nResults() - 1);
// no C array is made so:
C = newArray(nResults() - 1);
D = getResult("B", nResults() - 1);
    
for (i = 0; i < nResults() - 2; i++) {
    A[i] = getResult("A", i);
    B[i] = getResult("B", i);
    C[i] = A[i] - D;
    // should the line above should be C[i] = B[i] - D;
    print(f, d2s(A[i],6) + "  \t" + d2s(B[i],6) + " \t" + d2s(C[i],6));
}
File.close(f);

Обратите внимание, что вам вообще не нужно создавать массивы, и вы можете просто записать в файл (опять же, это не проверено):

directory = getDirectory("Choose a Directory");
resultFilename = directory + Dialog.getString() + ".csv";
f = File.open(resultFilename);

D = getResult("B", nResults() - 1);
    
for (i = 0; i < nResults() - 2; i++) {
    ai = getResult("A", i);
    bi = getResult("B", i);
    ci = ai - D;
    // should the line above should be ci = bi - D;
    print(f, d2s(ai,6) + "  \t" + d2s(bi,6) + " \t" + d2s(ci,6));
}
File.close(f);

Я использовал \t (символ табуляции) в качестве разделителя, а не запятой.

person quantixed    schedule 07.03.2021
comment
Привет, @quantixed, спасибо за помощь. Я попробовал оба предложенных вами решения, но теперь скрипт не открывает изображения для анализа и просто создает пустой файл результата. - person Novice_123; 09.03.2021
comment
@Novice_123 Код, который вы разместили, не дает никаких подсказок относительно того, почему это может быть так. Ваш вопрос лучше подходит для forum.image.sc, а не для SO - person quantixed; 10.03.2021
comment
спасибо за другую ссылку. Я задал вопрос там и надеюсь получить ответ в ближайшее время. Еще раз спасибо за вашу помощь. - person Novice_123; 11.03.2021