gimran писал(а):Порывшись в мануалах не нашел, как данные текстовые файлы загрузить в GRASS для дальнейшей классификации космоснимка на основе предзагруженных спектров отражения природных объектов.
Я не знаю, есть ли специальные модули для классификации на основе библиотек, но, насколько я себе представляю, там очень простая логика работы, для реализации которой хватит растрового калькулятора. Вообще, похоже вопрос больше стоит о том, какой алгоритм классификации реализован в ENVI.
Предположим, что у нас есть два класса объектов A и B (если их больше, то на логику работы это не влияет, изменится лишь количество вычислений). Допустим у нас есть снимки в n диапазонах (1, 2, ..., n). Тогда из библиотеки извлекаются данные по отражательной способности каждого класса по каждому диапазону, в итоге имеем два массива (вектора) чисел:
Берем точку на местности, ей соответствует n пикселей с каждого диапазона снимка
Вопрос: к какому классу отнести данную точку?
Ответ: к тому, до которого расстояние будет меньше. Значит, нужно сравнить расстояния d(a,p) и d(b,p)
И вот тут начинается наиболее интересное -- вопрос в том, как вычисляется расстояние. Способов огромное количество.
Не знаю почему, но мне кажется, что в ENVI используется угловое расстояние (может, слышал что-то краем уха), в этом случае, расстояние расчитывается при помощи косинуса угла между векторами (a,p) и (b,p). Чем больше косинус, тем меньше угол, т.е. тем ближе значения пикселя p к соответствующему классу.
Рассчитать косинус очень просто: находим скалярное произведение, потом делим его на длины векторов. В GRASS это легко проделывается в растровом калькуляторе.
Итак, пусть P1, P2, ..., Pn -- снимки, тогда в растровом калькуляторе получаем растр косинусов углов между вектором p и вектором a:
Код: Выделить всё
Ca = (P1*a1 + P2*a2 + ... + Pn*an)/(sqrt (a1*a1 + a2*a2 +...+ an*an) * sqrt(P1*P1 + P2*P2 +...+ Pn*Pn))
аналогично растр косинусов глов между вектором p и вектором b:
Код: Выделить всё
Ca = (P1*b1 + P2*b2 + ... + Pn*bn)/(sqrt (b1*b1 + b2*b2 +...+ bn*bn) * sqrt(P1*P1 + P2*P2 +...+ Pn*Pn))
Тогда пиксель отнесем к классу A, если cos(a,p) > cos(b,p). В растровом калькуляторе:
A = Ca > Cb
B = Cb > Ca
получаем два растра -- результаты классификации.
Если классов больше, то логика та же самая, только уравнений тоже прибавится.
Понятно, что расстояние можно считать по разному, вовсе не обязательно использовать косинусы. Так что главный вопрос -- какой метод вы выберете.