Вычисление индексов

Вход: растр, параметры (один или несколько индексов)

Выход: растр.

Данная процедура вычисляет одну или несколько формул, заданных пользователем, на основе значений входного растра.

Каждый канал нового растра соответствует одной формуле. Число каналов равно числу формул, заданных в параметрах. Высота и ширина нового растра равны высоте и ширине исходного растра.

Для доступа к пикселям исходного файла используется функция vn(m). Для точки с координатами (x, y, z) генерируемого растра вычисляется значение z-й формулы, причем значение функции vn(m) при вычислении этой формулы равно значению пикселя с координатами (x, y, m) исходного растра. Аргумент m должен быть целым числом от 1 до числа, равного количеству каналов в исходном файле. Примеры:

  • vn(100)/vn(200) - построить канал, равный отношению 100-го и 200-го каналов.
  • 0.75*vn(80)+0.25*vn(120) - построить канал, равный линейной комбинации 80-го и 120-го каналов.

Функция v(m) работает аналогично, но ее аргументом является не номер канала, а длина волны в нанометрах. Программа будет использовать канал с ближайшей к указанной длиной волны. Максимальное расхождение длины волны — 10 нм. Если подходящий канал не найден, то выдается ошибка. Выбранные каналы записываются в лог.

Редактирование формул

При добавлении данной процедуре в редакторе процедур появится форма ввода формул. Для добавления индекса нажмите Добавить индекс. Укажите название индекса (необязательно). Введите код для вычисления индекса и нажмите OK. После этого будет показан список добавленных индексов. Чтобы изменить или удалить индекс, выделите его в списке и нажмите соответствующую кнопку под списком.

Синтаксис формул

Синтаксис формул соответствует синтаксису JavaScript. Ниже описаны наиболее важные правила, использующиеся при написании формул.

Вы можете использовать целые числа (например, 42), числа с десятичной точкой (42.24), числа с экспонентой (5e-2, т.е. 0.05; 4.2e4, т.е. 42000).

Доступные операторы: +, -, *, /, % (сложение, вычитание, умножение, деление, остаток от деления). Если при вычислении возникает деление на нуль или другая ошибка, либо полученное значение равно бесконечности, такие результаты интерпретируются как нулевое значение и отображаются прозрачными точками.

Можно использовать тернарный оператор для условных вычислений: условие ? значение1 : значение2. Такое выражение равно первому значению, если условие истинно, и второму, если условие ложно. Например: vn(1) == 0? 0 : vn(1)+10, т.е. если значение в первом канале равно 0, вернуть 0, иначе вернуть значение в первом канале, увеличенное на 10.

Для расстановки приоритетов операций используйте круглые скобки:

  • vn(100)+1(200)*5 - сначала выполняется умножение, потом сложение;
  • (vn(100)+1(200))*5 - сначала выполняется сложение, потом умножение;

Используйте пробелы для повышения читабельности формулы. Пробелы не влияют на вычисление формулы.

Можно использовать переменные для хранения промежуточных результатов. Переменные декларируются с помощью ключевого слова var. Не используйте переменные и именем a или b, т.к. это помешает использовать функции с этими именами. Для разделения выражений используйте точку с запятой и перенос строки. Пример:

var x = vn(2) * vn(4);
x * x - 2 * x

В выходной растр будет записан результат вычисления последнего выражения.

Доступны следующие математические функции и константы:

Выражение Значение
Math.E e (2.718)
Math.LN2 ln(2) (0.693)
Math.LN10 ln(10) (2.302)
Math.LOG2E log2(e) (1.442)
Math.LOG10E log10(e) (0.434)
Math.PI π (3.14)
Math.SQRT1_2 \sqrt{1/2} (0.707)
Math.SQRT2 \sqrt{2} (1.414)
Math.abs(x) модуль
Math.acos(x) арккосинус в радианах
Math.asin(x) арксинус в радианах
Math.atan(x) арктангенс в радианах (между -π/2 и π/2)
Math.atan2(y,x) арктангенс частного от его аргументов
Math.ceil(x) округление до целого в большую сторону
Math.cos(x) косинус (x в радианах)
Math.exp(x) e^x
Math.floor(x) округление до целого в меньшую сторону
Math.log(x) натуральный логарифм
Math.max(x,y,z,...,n) максимальное значение
Math.min(x,y,z,...,n) минимальное значение
Math.pow(x,y) x^y
Math.random() случайное значение в интервале [0, 1]
Math.round(x) округление до ближайшего целого
Math.sin(x) синус (x в радианах)
Math.sqrt(x) \sqrt{x}
Math.tan(x) тангенс (x в радианах)

Например: Math.sqrt(vn(200)) + Math.pow(vn(100), 2).

Если формула была введена с ошибками, программа выдаст ошибку. Программа проверяет синтаксис, существование используемых функций. Однако формула может быть неправильной, даже если прошла первоначальную проверку (например, Math.pow(vn(200)) - неверная формула, т.к. функция принимает два аргумента, а передан один). Признаком неправильной функции являются нули в таблице значений.

Библиотека индексов

При нажатии на кнопку добавления индексов из библиотеки открывается таблица с названиями индексов, описаниями и формулами. Соответствующий таблице csv-файл хранится по адресу data/indexes.csv. Индексы взяты из книги “Advances in Environmental Remote Sensing. Sensors, Algorithms and Applications”. Таблица позволяет выделять несколько строчек, при нажатии на кнопку “Добавить выделенные индексы” произойдет добавление выбранных индексов в форму редактора параметров процедуры вычисления индексов для растра.

Галочка “Показать неподходящие индексы” включает в таблице отображение индексов, которые невозможно вычислить для данного растра из-за ошибки в формуле или отсутствия в растре каналов с нужными длинами волн или номерами.

Оглавление

Предыдущий раздел

Анализ главных компонент

Следующий раздел

Гистограмма по 2 каналам растра