Скачать .docx |
Дипломная работа: Обработка и визуализация объектов на космических изображениях средствами пакета Contour
Дипломная работа
Обработка и визуализация объектов на космических изображениях средствами пакета Contour
Оглавление
Введение
1.1 Физические основы дистанционного зондирования
1.3 Основы теории цвета
1.4 Растровая и векторная графика
2. Методика эксперимента
3. Экспериментальные результаты
Выводы
Введение
В последнее десятилетие для России важное значение приобрели спутниковые методы исследования ее территории. Это связано как с дальнейшим совершенствованием космической техники, так и со свертыванием авиационных и наземных методов мониторинга.
Основные области применения спутникового дистанционного зондирования - получение информации о состоянии окружающей среды и землепользовании, изучение растительных сообществ, оценка урожая сельскохозяйственных культур, оценка последствий стихийных бедствий. Средства дистанционного зондирования эффективны при изучении загрязнения почвы и водоемов, льдов на суше и на воде, и океанологии. Эти средства позволяют получать сведения о состоянии атмосферы, в том числе глобальном масштабе. Данные зондирования поступают в виде растровых изображений земли из космоса. Они и являются моим объектом исследования в данной работе. А предметом исследования - любые аномальные области (вырубки, гари…) на снимках. Обнаружение и обработка таких областей является важным процессом и занимает достаточно большое количество времени и системных ресурсов. В данной работе создано программное обеспечение в качестве одной из разновидностей геоинформационных систем, позволяющей проводить классификацию по цветам, оконтуривать классы и производить тематическую обработку для оптимизации процесса обработки космической информации на снимках при минимальной потере качества. Написанное программное обеспечение позволяет проводить эффективное оконтуривание областей, представлять границы в векторном формате для экспортирования в мировые геоинформационные системы. Результаты данной работы являются актуальными и востребованными в сфере работ наземных служб по контролю растительного покрова Земли.
1. Литературный обзор
1.1 Физические основы дистанционного зондирования
При дистанционном зондировании Земли из космоса используется оптический диапазон электромагнитных волн и микроволновый участок радиодиапазона. На рис.1.1 представлен оптический диапазон, включающий в себя ультрафиолетовый (УФ) участок спектра, видимый участок - синяя полоса (С), зеленая (З), красная (К); инфракрасный участок (ИК) - ближний ИК (БИК), средний ИК (СИК) и тепловой ИК (ТИК) [1].
В пассивных методах зондирования в оптическом диапазоне источниками электромагнитной энергии являются разогретые до достаточно высокой температуры твердые, жидкие, газообразные тела.
При термодинамическом равновесии с окружающей средой все тела с одинаковой температурой Т излучают одинаково (первый закон Кирхгофа).
В состоянии термодинамического равновесия поглощаемая в секунду участком поверхности энергия равна энергии, излучаемой в тот же промежуток времени той же поверхностью (второй закон Кирхгофа).
Интенсивность излучения I в заданном направлении, характеризуемом углом a от нормали к излучающей поверхности абсолютно черного тела, определяется законом Ламберта: I= I 0 cosa, где I 0 - интенсивность излучения при a = 0, которая максимальна; при a = 90°, т.е. по касательной к поверхности, интенсивность излучения равна нулю.
По формуле Планка плотность потока мощности, излучаемой в состоянии термодинамического равновесия единицей поверхности абсолютно черного тела с температурой T в интервале длин волн l, l + dlв телесный угол 2p стерадиан (ср )
B (l,T) = ×× (1.1)
Здесь с 1 = 1, 1911×108 Вт×мкм4 /м2 ср ; c 2 = 14388 мкм×К; Максимум излучения приходится на l = 2898/Tмкм.
Полная энергия во всем интервале длин волн описывается формулой Стефана-Больцмана:
¥
ò B (l,T) dl= a ×T4 , a = 5,67*10-8 Вт×м - 2 ×К-4 . (1.2)
0
При наблюдении Земли из космоса на длине волны короче 2-3 мкм регистрируется энергия Солнца, отраженная и рассеянная поверхностью суши, воды и облаков.
Температура поверхности (фотосферы) Солнца равна 5785 К, максимум излучения приходится на 0,5 мкм. На рис.1.2 приведено распределение энергии в спектре Солнца согласно формуле Планка. Озон, содержащийся в атмосфере в небольшом количестве, сильно поглощает ультрафиолетовое излучение с длиной волны короче 0,3 мкм, так что при наблюдении Солнца с поверхности Земли отсутствует коротковолновый скат кривой B (l,T) (заштрихован на рис.1.2).
В остальном реальный спектр Солнца мало отличается от рис.1.2.
Рис 1.2. Распределение энергии в спектре Солнца согласно закону Планка
На длинах волн более 4 мкм собственное тепловое излучение Земли превосходит излучение Солнца. Регистрируя интенсивность теплового излучения Земли из космоса, можно достаточно точно оценивать температуру суши и водной поверхности, которая является важнейшей экологической характеристикой [2].
При регистрации теплового излучения со спутников используется интервал длин волн 10-14 мкм, в котором поглощение в атмосфере невелико. При температуре земной поверхности (облаков), равной минус 50° С, максимум излучения согласно (1.1) приходится на 12 мкм, при 50° С - на 9 мкм.
Если с помощью датчика, установленного на спутнике, измерено значение плотности потока мощности B=B (λ, Т) от некоторого объекта, то из (1.1) получаем: T= λ/c2 ln (c1 /λ5 B+ 1). Определенная по интенсивности В теплового излучения (радиации) температура Т носит название радиационной , в отличие от термодинамической температуры, характеризующей интенсивность теплового движения молекул вещества и измеряемой контактным термометром [3].
1.2 Сегментация изображений
Одним из самых распространенных методов выделения объектов на космических изображениях Земли является сегментация. Этот метод носит черты и детерминированного, и статистического подходов. Под сегментацией, в широком смысле, понимают преобразование полутоновых или цветных изображений в изображения, имеющие меньшее число тонов или цветов, чем исходные. В узком смысле сегментацией называют преобразование полутонового изображения в двухуровневое (бинарное), содержащее всего два уровня яркости - минимальный (обычно это 0) и максимальный (обычно 255). При этом объект и фон разделены, легко определить число объектов, характеристики их местоположения (координаты, поворот выделенной оси объекта относительно координатных осей и т.п.), геометрические характеристики (например площадь каждого объекта, периметр, средний, минимальный, максимальный размеры) и, наконец, идентифицировать объект - указать, что это такое [4].
Целью сегментации является выделение областей, однородных в каком-то определенном заданном смысле (сегментов). Однородность является признаком принадлежности области к определенному классу.
Очень часто сегментация используется для выделения областей приблизительно одинакового тона и/или цвета. Вместе с тем сегментация часто используется для выделения областей, однородных в смысле некоторого более сложного свойства (например типа текстуры). Такие области принято называть кластерами [5].
Текстурой в теории обработки изображений называют структуру, которая характеризуется наличием повторяющегося "рисунка", состоящего из некоторых однородных участков приблизительно одинаковых размеров. Примером текстурного изображения являются фотоснимок кирпичной стены, аэрофотоснимок городских кварталов, космическое изображение участка летней тундры с многочисленными круглыми озерами.
Применяются три основных способа сегментации изображений: пороговая, путем наращивания областей, путем выделения границ.
Пороговая сегментация состоит в простом объединении близких по характеристикам областей изображения в небольшое число сегментов. Пороговая сегментация может осуществляться на основе априорно заданных порогов. Если яркость превышает порог, то элемент изображения относят к одному сегменту, если она ниже порога - то к другому. Это самый простой способ и требует минимальных вычислительных затрат [6].
Другой, более адекватный, способ выбора порогов заключается в том, что пороги выбираются как границы мод гистограммы изображения. Рассмотрим более подробно этот способ выбора на примере бинаризации полутонового изображения, у которого гистограмма содержит две моды.
Если моды гистограмм не перекрываются или перекрываются слабо, то выбор порога разбиения изображения на две области U 1 и U 2 не представляют труда. Этот случай типичен для задачи выделения площадей, покрытых снегом и льдом на фоне леса и оттаявшей земли по результатам дистанционных исследований. Гистограмма такого изображения имеет две моды - одна отвечает более темному фону, вторая - объектам с большей яркостью, т.е. снегу/льду, между модами существует резкая и протяженная зона минимума. Порог можно выбрать посередине зоны (рис.1.4).
В способе сегментация путем наращивания областей выделяются однородные области. Рассмотрим вначале сегментацию путем наращивания областей с использованием критерия однородности по значению яркости (вектора яркости). Схема алгоритма этого метода предусматривает выбор стартового пикселя и рассмотрение смежных с ним пикселей для проверки близости их значений, например, по евклидову расстоянию. Если значения яркости текущего и какого-либо смежного пикселей оказываются близкими, то эти пиксели зачисляются в одну область. Таким образом, область формируется в результате сращивания отдельных пикселей. На определенном этапе (зависящем от модификации алгоритма) область проверяется на однородность и, если результат проверки оказывается отрицательным, то область разбивается на более мелкие участки. Процесс продолжается до тех пор, пока все выделенные области не выдержат проверки на однородность [7].
Общая схема проверки области на однородность состоит в следующем. Пусть F (R ) - заданная мера однородности области R . Если R 12 = R 1 ∩R 2 , то критерий однородности можно задать, потребовав, чтобы выполнялось условие F (R 12 ) ≤ ε, ε - заданный порог.
Таким образом, при сегментации путем наращивания областей учитывается структура области, её связность. Это бывает важно при обработке данных дистанционного зондирования, нередко этот метод дает лучшие результаты, чем другие методы, не учитывающие связность и рассчитанные на индивидуальное отнесение каждого пикселя к тому или иному классу.
Дальнейшая классификация алгоритмов основана на способе наращивания области. При использовании квадратной или прямоугольной сетки используются 2 вида связности: 4 - и 8-связность [8].
Сегментация путем выделения границ предусматривает использование оператора градиента. После этого для установления факта, что действительно обнаружена граница, применяется процедура разделения по порогу. Затем пиксели, идентифицированные как граничные, соединяются в замкнутые кривые, окружающие соответствующие области.
В этом методе, как и в других методах сегментации, существенным является критерий однородности области, по характеристике которой и вычисляются значения градиента. Прямые методы сегментации путем выделения границ предусматривают применение к исходному изображению.
Задача построения границ сегментов на изображении градиента выступает в качестве самостоятельной задачи. Вообще говоря, эта задача довольно сложная и может быть решена лишь в самых простейших случаях. Например, можно выделять локальные максимумы градиента всех строк и столбцов изображения [9].
Сегментация путем выделения границ показала, что метод достаточно хорошо работает только при большой протяженности границы [10].
1.3 Основы теории цвета
Глаз . Если опустить несущественные для восприятия цвета оптические детали, глаз подобен цифровому фотоаппарату с очень неравномерным распределением пикселей по площади кадра.
"Пикселями" на сетчатке глаза служат светочувствительные клетки двух разновидностей: палочки и колбочки. Причем, палочки действуют в основном при слабом освещении и предоставляют информацию лишь о яркости, а колбочки, эффективно действующие только при достаточно ярком свете, позволяют глазу различать цвета.
Колбочки трех типов, называемые обычно S-, M-, и L-колбочками, воспринимают свет соответственно в коротко-, средне-, и длинноволновой областях спектра. Часто их называют также синими, зелеными и красными колбочками, что не совсем корректно, но зато, наглядно.
Примерно следующим образом распределяется чувствительность клеток сетчатки (рис.1.3):
Рис.1.3 Распределение чувствительности клеток сетчатки
Заметим, что это нормализованная чувствительность. В абсолютных значениях чувствительность палочек примерно вдвое превосходит максимальную чувствительность колбочек, а сами колбочки активно подстраиваются под освещение и почти никогда не обладают одинаковыми максимумами чувствительности [11].
Сетчатка глаза содержит примерно 100 млн. палочек и 5 млн. колбочек. В центре сетчатки, в области так называемого "желтого пятна" больше концентрация красных и зеленых колбочек, на периферии - палочек и синих колбочек. В центре желтого пятна - "ямке" - палочек и синих колбочек нет вообще. Как следствие, мелкие красные и зеленые детали различить нам не составляет труда, а синие, если смотреть прямо на них, мало отличаются от черных.
Основная информация о деталях изображения и о цветах доставляется нам колбочками, расположенными в желтом пятне и ямке. Периферийное зрение имеет достаточно невысокое разрешение и не позволяет толком различать цвета. В то же время, увеличение концентрации палочек делает периферийное зрение более действенным в темноте. Ночью, зачастую, проще рассмотреть темный объект, отведя взгляд чуть в сторону.
программа contour delphi зондирование
Также различием палочек и колбочек определяется ночной сдвиг пика чувствительности, называемый эффектом Пуркинье. При ярком свете глаз наиболее чувствителен к длинам волн около 554 нм, но в темноте, когда зрение практически полностью определяется палочками, пик чувствительности сдвигается к 511 нм. Таким образом, ночью все кошки действительно становятся серыми, и если вы умудритесь найти кошек синего и красного цветов, то синяя, посерев, станет гораздо светлее красной.
Подбор цветов в трехцветность . До сих пор мы говорили о цвете как о спектральной характеристике света, т.е. о его физическом смысле. Рассмотрим теперь более житейское понимание цвета. Зеленый цвет дает зеленая лампочка, красный - красная. Если на белый лист бумаги посветить обеими лампочками - он станет желтым. Что это означает? Означает это, что одни цвета можно получить смешением других. Очевидный, казалось бы, вывод становится совсем неочевидным при распространении его на все возможные цвета. Один из основных опытов, служащих изучению цвета - подбор цветовых пар. Представьте нейтральный экран в темной комнате: левая его половина освещается лампой некоторого заданного цвета (тестовый цвет), а правая - одновременно несколькими лампами разных цветов, называемых основными. Теперь будем изменять яркость отдельных ламп основных цветов, пытаясь сделать их общий цвет неотличимым от тестового. Закончив подбор, запишем тестовый цвет как сумму основных с соответствующими яркостям ламп весовыми коэффициентами. Эксперимент показывает, что подобрать цвета таким образом возможно практически во всех случаях, но основных цветов может понадобиться очень и очень много.
Второй важный момент, который выясняется в таких экспериментах: сложение цветов происходит линейно. При использовании n основных цветов, любой тестовый цвет мы можем представить как вектор в n -мерном пространстве их яркостей и при необходимости комбинирования нескольких "левых" цветов, для которых подобраны координаты, рассматривать их смешение как сложение соответствующих векторов со всеми вытекающими из этого правилами.
Заметьте: цвет мы подбираем исключительно по ощущениям, не пользуясь никакими измерительными приборами кроме собственных глаз. Более того: воспользуйся мы такими приборами - выяснили бы, скорее всего, что спектральные характеристики излучения одинаковых для глаза половинок экрана здорово отличаются.
Существенным дополнением к эксперименту подбора будет введение возможности разностного сопоставления цветов. Разрешим перенаправлять часть ламп с правой части экрана на левую, а коэффициенты их яркостей в этом случае будем считать отрицательными. При таком допущении оказывается, что большинству наблюдателей достаточно лишь трех линейно-независимых основных цветов для подбора коэффициентов к любому тестовому цвету.
Этот факт легко объясним, если вспомнить о физическом смысле цвета и том, как он воспринимается. Цвет как спектральная характеристика представляет собой вектор в бесконечномерном пространстве, каждой координате которого соответствует идеальный монохромный источник света. Воспринимая излучение, наш мозг оперирует величинами возбуждения трех рецепторов. Таким образом, процесс восприятия глазом цветов представляет собой проецирование бесконечномерного вектора на трехмерное пространство.
Теперь понятно, почему подобранные "на глаз" цвета могли сильно различаться по спектральным характеристикам. Понятно также, что, оперируя векторами в трехмерном пространстве воспринимаемых цветов (его часто называют цветовым пространством LMS по названиям типов колбочек), мы можем без зазрения совести выбирать любые другие тройки базисных векторов, которые нам покажутся удобными [12].
Цветовые пространства . Для чего мы вообще возимся с цветами? Цвета нам нужно воспроизводить - на бумаге, мониторе или где-нибудь еще, цвета нужно сравнивать и корректировать. Для всего этого цвета нужно уметь строго описывать, т.е. задавать и определять координаты того или иного цвета в некотором пространстве признаков.
Способов задавать координаты цветов придумано в избытке - попробуем разобраться, что из чего вытекает. Очевидным решением было бы использование в качестве координат коэффициентов основных цветов в эксперименте подбора цвета. Если для каждой длины волны λ подобрать коэффициенты основных цветов A, B и C, мы получим некоторые зависимости a (λ), b (λ), c (λ), которые называются функциями подбора цвета. Любой чистый (монохромный) цвет теперь можно будет найти как Цвет (λ) = a (λ) + b (λ) + c (λ).
Если в качестве основных цветов выбрать красный, зеленый и синий с длинами волн 645.16 нм, 526.32 нм и 444.44 нм соответственно, функции подбора цвета для среднего наблюдателя примут следующий вид (рис 1.4):
Рис.1.4 Функции подбора цвета
Отрицательные значения функций указывают на необходимость разностного сопоставления цветов. Для описания независимого цвета это не слишком удобно. Еще хуже, что избавиться от отрицательных значений нам не удастся ни при какой реальной тройке основных цветов. Чтобы избавиться от отрицательных коэффициентов в выражениях для цветовых пар, можно немного переопределить спектры основных цветов, что, правда, сделает их нереальными по отдельности [13].
CIE (Commission internationale de l’eclairage, или МКО - Международная комиссия по освещению) предлагает использовать в качестве основных условные цвета X, Y Z. Вам не удастся найти их в природе - спектральная плотность этих цветов на некоторых длинах волн отрицательна. Хотя, сами X, Y и Z не являются реальными цветами, подобраны они так, что любой реальный цвет представим в виде их линейной комбинации с неотрицательными коэффициентами. Так выглядят функции подбора для XYZ (рис.1.5):
Рис.1.5 Функции подбора цвета для XYZ
Теперь любой реальный цвет мы можем представить вектором в пространстве XYZ (CIE XYZ), но далеко не любой вектор в этом пространстве представляет реальный цвет. В прямоугольной системе координат XYZ область видимых человеческим глазом цветов представляет собой конус со сложным основанием (рис.1.6):
Рис.1.6. Видимая область цвета человеческим глазом
Крайне удобным производным от XYZ пространством является CIE xy, получаемое сечением XYZ плоскостью X+Y+Z=1 . На плоскости вводится система координат с началом в точке пересечения плоскости с осью Z и координатами x и y , равными единицам в точках пересечения плоскости с осями X и Y соответственно. В результате получается следующее (рис.1.7):
Рис.1.7 Плоскость сечения
Рассмотрим рисунок подробнее. Цвета в пределах плоскости xy отличаются по цветовому тону и насыщенности, в то время как яркость (расстояние до нуля XYZ) остается за пределами описания. Иногда для полного описания цвета используют пространство xyY , рассматривая в качестве яркости значение Y .
Яркость .
Строго говоря, яркость - это физическая характеристика источника света, описывающая его излучение в данном направлении. В контексте цветов корректнее было бы говорить о светлоте, как субъективном отличии яркости данного цвета от яркости эталонного белого. Используются, однако, оба термина: можно считать, что светлота характеризует отличие цвета от белого, а яркость - его отличие от черного. В переводной литературе в качестве синонима яркости иногда используется термин "значение" (value).
Численно яркость может определяться по-разному. В пространстве XYZ или аналогичном ему под яркостью может пониматься евклидово расстояние до начала координат, сумма всех трех координат или двух из них. Иногда используется наибольшее значение из трех координат цвета или среднее арифметическое двух наибольших. В этой статье мы не будем углубляться в дебри тонких различий, не критичных для общего понимания теории цвета. Какой бы термин вы ни использовали для яркости/светлоты и как бы ни определяли величину, суть остается неизменной. Абстрагировавшись от цветового тона и насыщенности, мы получим отрезок, на одном конце которого будет белый цвет, а на другом - черный.
Вернемся к плоскости xy . На плавной дуге, ограничивающей область видимых цветов, отмечены длины волн. На ней же располагаются соответствующие этим длинам волн чистые спектральные цвета. Соединяющий фиолетовый с красным отрезок служит прибежищем пурпурных цветов - там же располагается и маджента. Пурпурный - неспектральный цвет, у него нет своей длины волны или диапазона длин волн. Ощущения пурпурных тонов возникают в результате приема глазом смеси красных и фиолетовых цветов [14].
Цвета на ограничивающей кривой чистые, т.е. обладают максимальной насыщенностью. По мере приближения к центру области насыщенность падает, пока, наконец, цвет не становится белым (строго говоря - серым). Координаты точки, в которой цвет становится белым - "точки белого" - зависят от текущего состояния глаз, адаптирующихся к освещению. При рассмотрении сцены, освещенной единственным источником света, точка белого зависит от цветовой температуры этого источника. На рисунке отмечена кривая цветовой температуры, вдоль которой перемещается точка белого при освещении источниками света, соответствующими модели АЧТ. Для неидеальных источников точка белого может смещаться и в перпендикулярном кривой температур направлении.
Самым полезным свойством пространства xy является наглядное представление производных цветов. Для любого набора основных цветов все воспроизводимые путем их смешения цвета будут располагаться в пространстве xy внутри минимального выпуклого многоугольника, описывающего точки основных цветов. Если смешивать два основных цвета A и B, то все цвета, которые можно получить таким смешением, будут располагаться на отрезке AB плоскости xy . Если основных цветов три - все возможные производные цвета будут располагаться в треугольнике, образуемом основными. Если, например, в каждом пикселе монитора мы смешиваем основные цвета RGB, выбранные как показано на рисунке, несложно определить треугольник цветов, которые такой монитор способен воспроизвести. Хорошо видно, что никакой монитор, даже при идеальных монохромных пикселях, не сможет воспроизвести все видимые цвета. Впрочем, это мы знали и раньше: в противном случае не возникло бы необходимости в цветах XYZ .
Поскольку производные от двух цветов всегда лежат на соединяющем их отрезке, очевидно, что для любого цвета можно подобрать второй, который в смешении с ним будет давать белый. Цвета, смешением которых в определенных пропорциях можно получить белый, называются дополнительными. При этом говорят обычно о чистых цветах, т.е., фактически, о тонах.
Во всех случаях реального воспроизведения цветов нас мало интересуют цвета нереальные, а также реальные, но невоспроизводимые. Вполне естественным в таком случае будет использование основных цветов воспроизводящего устройства в качестве базисных векторов пространства. Для традиционных красного, зеленого и синего получим трехмерное RGB-пространство, область реальных цветов которого ограничена кубом (рис.1.8):
Рис.1.8 RGB-пространство
В единичных точках на осях RGB мы имеем основные цвета, в начале координат черный, в точке (1, 1, 1) - белый, а при попарном смешении основных цветов получаем дополнительные к третьему: циан, мадженту и желтый. Все остальные воспроизводимые нашим устройством цвета располагаются внутри куба [15].
Попробуем теперь отделить цветовую информацию от яркостной. Сместим немного точку наблюдения так, чтобы белый цвет совпал с черным, и нарисуем полностью цвета ярких граней куба (рис.1.9):
Рис.1.9 RGB-куб. Направление [111]
Яркость теперь снова можно считать расстоянием до начала координат. Сгладив углы шестиугольника на иллюстрации, получим хорошо всем знакомый цветовой круг (рис.1.10):
Рис.1.10 Цветовой круг
Любой цвет на таком круге задается в полярной системе координат: цветовой тон определяет угол, а насыщенность - расстояние от центра (белого). Вспомнив про яркостную составляющую, и дополнив ею систему координат до цилиндрической, получаем HSB - еще одно пространство для описания любого цвета. Заметим на этот раз, что не совсем любого, а любого воспроизводимого [16].
HSB (HSV), HSL, LCH
HSB (Hue, Saturation, Brightness) = тон , насыщенность , яркость ;
HSV (Hue, Saturation, Value) = тон , насыщенность , значение ;
HSL (Hue, Saturation, Lightness) = тон , насыщенность , светлота ;
LCH (Lightness, Chroma, Hue) = светлота , цветность , тон .
Различия перечисленных цветовых пространств сродни различию светлоты и яркости: термины, в принципе, разные, но на понятийном уровне эквивалентные. Все они описывают координаты цвета в цилиндрических координатах. Численные определения могут различаться, но hue всегда задает цветовой тон, saturation/chroma - насыщенность, а brightness/lightness/value - высоту в цилиндре, путь от белого к черному.
1.4 Растровая и векторная графика
Одно и то же изображение может быть представлено в памяти ЭВМ двумя принципиально различными способами и получено два различных типа изображения: растровое и векторное. Рассмотрим подробнее эти способы представления изображений, выделим их основные параметры и определим их достоинства и недостатки.
Что такое растровое изображение?
Возьмём рисунок (рис.1.11). Конечно, она тоже состоит из маленьких элементов, но будем считать, что отдельные элементы мы рассмотреть не можем. Она представляется для нас, как реальная картина природы.
Теперь разобьём это изображение на маленькие квадратики (маленькие, но всё-таки чётко различимые), и каждый квадратик закрасим цветом, преобладающим в нём (на самом деле программы при оцифровке генерируют некий "средний" цвет, т.е. если у нас была одна чёрная точка и одна белая, то квадратик будет иметь серый цвет) [17].
Как мы видим, изображение стало состоять из конечного числа квадратиков определённого цвета. Эти квадратики называют pixel (от PICture ELemen t) - пиксел или пиксель.
Рис.1.11 Исходное изображение
Теперь каким-либо методом занумеруем цвета. Конкретная реализация этих методов нас пока не интересует. Для нас сейчас важно то, что каждый пиксель на рисунке стал иметь определённый цвет, обозначенный цифрой (рис.1.12).
Рис.1.12 Фрагмент оцифрованного изображения и номера цветов
Теперь пойдём по порядку (слева направо и сверху вниз) и будем в строчку выписывать номера цветов встречающихся пикселей. Получится строка примерно следующего вида:
1 2 8 3 212 45 67 45 127 4 78 225 34.
Вот эта строка и есть наши оцифрованные данные. Теперь мы можем сжать их (так как несжатые графические данные обычно имеют достаточно большой размер) и сохранить в файл [18].
Итак, под растровым (bitmap, raster) понимают способ представления изображения в виде совокупности отдельных точек (пикселей) различных цветов или оттенков. Это наиболее простой способ представления изображения, ибо таким образом видит наш глаз.
Достоинством такого способа является возможность получения фотореалистичного изображения высокого качества в различном цветовом диапазоне. Недостатком - высокая точность и широкий цветовой диапазон требуют увеличения объема файла для хранения изображения и оперативной памяти для его обработки.
Для векторной графики характерно разбиение изображения на ряд графических примитивов - точки, прямые, ломаные, дуги, полигоны. Таким образом, появляется возможность хранить не все точки изображения, а координаты узлов примитивов и их свойства (цвет, связь с другими узлами и т.д.) [19].
Вернемся к изображению на рис.1.11 Взглянем на него по-другому. На изображении легко можно выделить множество простых объектов - отрезки прямых, ломанные, эллипс, замкнутые кривые. Представим себе, что пространство рисунка существует в некоторой координатной системе. Тогда можно описать это изображение, как совокупность простых объектов, вышеперечисленных типов, координаты узлов которых заданы вектором относительно точки начала координат (рис.1.13).
Рис.1.13. Векторное изображение и узлы его примитивов
Проще говоря, чтобы компьютер нарисовал прямую, нужны координаты двух точек, которые связываются по кратчайшей прямой. Для дуги задается радиус и т.д. Таким образом, векторная иллюстрация - это набор геометрических примитивов.
Важной деталью является то, что объекты задаются независимо друг от друга и, следовательно, могут перекрываться между собой.
При использовании векторного представления изображение хранится в памяти как база данных описаний примитивов. Основные графические примитивы, используемые в векторных графических редакторах: точка, прямая, кривая Безье, эллипс (окружность), полигон (прямоугольник). Примитив строится вокруг его узлов (nodes). Координаты узлов задаются относительно координатной системы макета. Изображение будет представлять из себя массив описаний. Каждому узлу приписывается группа параметров, в зависимости от типа примитива, которые задают его геометрию относительно узла. Например, окружность задается одним узлом и одним параметром - радиусом. Такой набор параметров, которые играют роль коэффициентов и других величин в уравнениях и аналитических соотношениях объекта данного типа, называют аналитической моделью примитива [20].
Векторное изображение может быть легко масштабировано без потери деталей, так как это требует пересчета сравнительно небольшого числа координат узлов. Другой термин - "object-orientedgraphics".
Самой простой аналогией векторного изображения может служить аппликация. Все изображение состоит из отдельных кусочков различной формы и цвета (даже части растра), "склеенных" между собой. Понятно, что таким образом трудно получить фотореалистичное изображение, так как на нем сложно выделить конечное число примитивов, однако существенными достоинствами векторного способа представления изображения, по сравнению с растровым, являются:
векторное изображение может быть легко масштабировано без потери качества, так как это требует пересчета сравнительно небольшого числа координат узлов;
графические файлы, в которых хранятся векторные изображения, имеют существенно меньший, по сравнению с растровыми, объем (порядка нескольких килобайт) [21].
Как видно, векторным можно назвать только способ описания изображения, а само изображение для нашего глаза всегда растровое [22].
Постановка задачи
Дешифрирование космических снимков, один из методов изучения местности по её изображению, полученному посредством космической съёмки. Заключается в выявлении и распознавании объектов, установлении их качественных и количественных характеристик, а также регистрации результатов в графической (условными знаками), цифровой и текстовой формах [23]. Дешифрирование имеет общие черты, присущие методу в целом, и известные различия, обусловленные особенностями отраслей науки и практики, в которых оно применяется наряду с другими методами исследований.
Эффективность дешифрирования, т.е. раскрытия содержащейся в снимках информации, определяется особенностями изучаемых объектов и характером их передачи при космической съёмке (дешифровочными признаками), совершенством методики работы, оснащённостью приборами и свойствами исполнителей дешифрирования. В ряду дешифровочных (демаскирующих) признаков различают прямые и косвенные (нередко с выделением комплексных). К прямым признакам относят: размеры, форму, тени собственные и падающие (иногда их считают косвенным признаком), фототон или цвет и сложный признак - рисунок или структуру изображения. К косвенным - указывающие на наличие или характеристику объекта, хотя он и не получил непосредственного отображения на снимке из космоса в силу условий съёмки или местности. Например, растительность и микрорельеф являются индикаторами при дешифрировании задернованных почв.
Цели работы:
1) разработать программный пакет для обработки космических изображений;
2) провести сравнительный анализ программ Contourи ErdasImagineдля оценки качества реализации собственного алгоритма сегментации;
3) с помощью собственного алгоритма сегментации провести анализ двух съемочных систем на примере LandsatETM+ и Spot5 для установления разницы в снимках с различным пространственным разрешением.
В задачи исследования входят:
1. анализ алгоритмов распознавания изображений;
2. выявление оптимального по скорости и качеству алгоритма сегментации;
3. составление блок-схемы программы по распознаванию изображений на основе выбранного алгоритма;
4. ознакомление с географическими информационными системами (ГИС), растровой и векторной моделей данных и их форматными представлениями;
5. выявление подходящего векторного формата для последующего его применения в ГИС-проектах;
6. создание географической привязки;
7. векторизация растровых контуров и сохранение в виде shp-файлов;
8. подобрать каналы с максимальной информативностью
Для решения задачи дешифрирования разработаны профессиональные программные пакеты, которые по своим функциям удовлетворяют предъявляемым требованиям. Основным недостатком этих пакетов является высокая стоимость, большие требования к системным ресурсам используемых персональных компьютеров и сложность в эксплуатации этих программ.
2. Методика эксперимента
В пакет программного обеспечения входит (рис.2.1):
Рис.2.1 Блок-схема программы
Автоматическое выделение границ основано на сегментации путем наращивания областей. Блок-схема данного алгоритма представлена на рис.2.2.
Рис.2.2 Блок-схема алгоритма сегментации путем наращивания областей
3. Экспериментальные результаты
Блок-схема программного обеспечения "Contour" по работе с растровыми изображениями (рис.3.1).
Рис.3.1 Блок-схема программы
Опишем более подробно все этапы алгоритма:
· На начальном этапе производим загрузку растрового изображения в любом графическом формате (TIF, BMP, JPG…). Рекомендуется в BMP, т.к. данный формат не предусматривает сжатия, и соответственно потерь уже на начальном этапе.
· Далее заносим все необходимые сведения о сцене для дальнейшей работы: проекции, зоны, датума, сфероида (для географической привязки и правильного отображения полигонов в ГИС), верхнего левого угла (для расчета размеров снимка), пространственного разрешения пикселя (для подсчета площадей и периметров полигонов).
· Теперь можно приступать к оконтуриванию гарей (или других объектов) методом сегментации путем наращивания областей. Однородность области проверяется на уровне порогов трех компонент RGB-композита. Осуществлена реализация ручной задачи данных порогов.
· Зная пространственное разрешение можно подсчитать площадь и периметр гари по количеству входящих в полигон пикселей. Каждому выделенному объекту присваивается идентификационный номер, и все сведения заносятся в базу данных.
· Затем следует сохранение контуров в бинаризованном виде (0 - фон, 1 - граница).
· Привязка к мировым географическим координатам.
· Далее путем векторизации растровых полигонов получение векторного типа данных.
· Полученные векторные данные хранятся в базе данных, которую уже можно использовать для дальнейшей работы в мировых ГИС-стандартах.
· И на данном последнем этапе загрузка векторных полигонов в ГИС-проекты.
Рис.3.2 Вид рабочего окна программы "Contour"
Программа "Contour" (рис.3.2) может выполнять следующие операции и функции:
· Изменять масштаб изображения, задаваемый как бегунком так и ручным вводом;
· Отслеживать внутренние и мировые географические координаты под курсором мыши и выводить их в статусной строке;
· Отслеживать RGB-компонент под курсором мыши и выводить их в статусной строке;
· Кнопка "Добавить" добавляет новый контур и присваивает ему уникальный идентификационный номер;
· В ручном режиме оконтуривания левой клавишей мыши выставляются вершины контура в реальном времени;
· В ручном режиме оконтуривания правой клавишей мыши обнуляются всех выставленные вершины;
· Задание Х и У - координат верхнего левого угла сцены;
· Задание пространственного разрешения снимка;
· Подсчитывание в реальном времени площади и периметра контура;
· Отслеживание количества выставленных вершин и выведение их в статусной строке;
· Изменение прозрачности для любого контура в любой момент времени;
· Кнопка "Удалить" (или клавиша "Del") удаляет любой выбранный контур;
· При выборе контура в таблице (или при нажатии клавиши "Ins") происходит "подсвечивание" контура на изображении;
· Через меню "Правка" удаляются последний и/или все контуры;
· Через меню "Файл" открытие снимка в графическом формате;
· Через меню "Файл" открытие контура (осуществляется только в том случае, если размеры снимка и контура совпадают);
· Через меню "Файл" сохраняется контура (-ов) в графическом формате BMPс файлом географической привязки к мировым координатам.
· В автоматическом выделении щелчок левой кнопки мыши запускает процесс выделения объекта;
· В автоматическом выделении выставление порога RGB-композита устанавливается по порядку в соответствующих полях для R,G и B - компонент.
Проведен сравнительный анализ на основе значений площадей при помощи программы Contour, с результатами дешифрирования участков, полученных в геоинформационном пакете ERDASIMAGINE9.1 используемым в настоящее время в Центре космического мониторинга и Институте леса.
Для того чтобы проводить сравнение нечетких спорных объектов, нужно сначала удостоверится на проверке оконтуривания простой однотонной геометрической фигуры (рис.3.3).
Рис.3.3 Сравнение полученных контуров (слева - в пакете " Contour", справа - в пакете " Erdas Imagine")
Площадь круга в обеих программах составила одинаковое значение - 7870 квадратных единиц. Это говорит о том, что программное обеспечение собственной разработки работает корректно и пригодно для последующей проверки более сложных областей на космических снимках.
Сравнены реальные объекты, присутствующие на снимках. Сначала в качестве простой задачи взяты три области лесных вырубок, потому что они имеют четкий контур и отличительно однотонный светло-зеленый фон. На рис.3.4 и рис.3.5 представлены контуры, полученные в программах "Contour" и "Erdas" соответственно.
Рис.3.4 Контур вырубок, полученный в программе "Erdas"
Рис.3.5 Контур вырубок, полученный в программе "Contour"
Таблица 3.1
Сравнение площадей программ
Номер полигона | Erdas, кв. ед. | Contour, кв. ед. | Расхождение |
1 | 10880 | 10897 | 0,16% |
2 | 10092 | 10110 | 0,18% |
3 | 8199 | 8220 | 0,25% |
Как видно из таблицы 3.1, минимальное расхождение в результатах составляет доли процента. Это связано в различии пороговых значений в "Contour" и евклидова расстояния в "Erdas".
И наконец, сравнены наиболее сложные области (имеющие большое количество классов), но так необходимые для повсеместного анализа - гари.
Рис.3.6 Контур гари, полученный в программе "Contour"
Рис.3.7 Контур гари, полученный в программе "Erdas"
Разница в площадях между контурами на рис.3.7 и рис.3.7 более 15%. Согласно зрительному дешифрованию, "Erdas" не должен был выделять область справа (отделена красной чертой). Здесь как раз и скрыты различия в алгоритмах выделения областей между программами. Это связано с тем, что в программе "Erdas" происходит выделение области по спектральным данным снимка, тогда как в программе "Contour" используется цветовая палитра RGB-композита, значение порога которой используется как своеобразный классификатор и полностью схож с принципом зрительного различения цветов. С помощью пакета Contour проведен сравнительный анализ съемочных систем на примере LandsatETM+ и Spot5 для установления разницы в площадях на снимках с различным пространственным разрешением. Пространственное разрешение спектрометра Landsat30м, Spot5 - 15м.
Рис.3.8 Контур области снимка Landsat
Рис.3.9 Контур области снимка Spot
Было проведено десять измерений различных областей.
Таблица 3.2
Сравнение площадей съемочных систем
Номер полигона | Landsat, кв. ед. | Spot, кв. ед. | Расхождение |
1 | 17010 | 18511 | 8.9% |
2 | 10092 | 10799 | 7% |
3 | 8199 | 8854 | 8.1% |
4 | 18462 | 19735 | 6.9% |
5 | 14785 | 15864 | 7.3% |
6 | 20153 | 21886 | 8.6% |
7 | 5143 | 5636 | 9.6% |
8 | 7549 | 8266 | 9.5% |
9 | 11889 | 12733 | 7.1% |
10 | 15300 | 16340 | 6.8% |
Среднее расхождение составило 7,9%. Это связано с большим пространственным разрешением у системы Spot. Так же можно отметить, что при сравнении малых областей, процент расхождения более высок, чем при сравнении больших областей. В дальнейшем, при работе со снимками Spot можно делать поправку на найденное процентное расхождение для сравнения этих съемочных систем.
Выводы
В проделанной работе получены следующие результаты:
1) Определены информативные спектральные каналы для формирования изображения с нужной цветопередачей: 5,4 и 3 для съемочной системы LandsatETM+.
2) Установлены цветовые формулы для обработки.
3) Разработан программный пакет Contourдля обработки и визуализации объектов на космических изображениях со следующими возможностями:
· Загрузка графических изображений;
· Создание растровых слоев;
· Выделение границы объектов;
· Расчет площадей и периметров;
· Создание бинарных слоев с границами объектов;
· Географическая привязка;
· Векторизация;
· Экспортирование shape-файлов.
4) Проведено сравнение с профессиональным пакетом "ErdasImagine9". Установлено, что на простых объектов (вырубок) результаты идентичны. Время обработки существенно ниже при той же точности. При сравнении более сложных областей (гарей) процент расхождения достигает 15%, что связано в различии пороговых значений, используемых в программах. Вероятность достоверного результата выше по причине меньшего количества спектральных каналов.
5) Проведен сравнительных анализ двух съемочных систем на примере LandsatETM+ и Spot5 с различными пространственными разрешениями. Среднее расхождение в 7.9% в дальнейшем можно учитывать как поправку при работе со снимками этих двух систем.
Список литературы
1. Кашкин В.Б., Сухинин А.И. Дистанционное зондирование Земли из космоса. Цифровая обработка изображений [текст]: учебник / В.Б. Кашкин, А.И. Сухинин. - М.: Логос, 2001. - 264 с.
2. Савельев, И.В. Курс общей физики / И.В. Савельев. - М.: Наука, 1968.
3. Ахманов, С.А. Введение в статистическую радиофизику и оптику / С.А. Ахманов, Ю.Е. Дьяков, А.С. Чиркин. - М.: Наука, 1981.
4. Тихомирова, В.А. Физика и биология / В.А. Тихомирова, А.И. Черноуцан. - М.: Бюро Квантум, 2001. - 128 с.
5. Чандра А.М., Гош С.К. Дистанционное зондирование и географические информационные системы [текст]: учебник / А.М. Чандра, С.К. Гош. - М.: Техносфера, 2008. - 312 с.
6. Берлянт, А.М. Картоведение / А.М. Берлянт. - М.: Аспект пресс, 2003. - 477 с.
7. Басараб М.А., Волосюк В.К., Горячкин О.В. Цифровая обработка сигналов и изображений в радиофизических приложениях [текст]: учебник / М.А. Басараб, В.К. Волосюк, О.В. Горячкин; Под ред. В.Ф. Кравченко. - М.: ФИЗМАТЛИТ, 2007. - 544 с.
8. Crosier S., Booth B. ArcGIS 9: Map projections [текст]: учебное пособие / S. Crosier, B. Booth. - New York: Environmental System Research Institute, 2004. - 116 p.
9. Crosier S., Booth B. ArcGIS 9: Getting started [текст]: учебное пособие / S. Crosier, B. Booth. - New York: Environmental System Research Institute, 2004. - 272 p.
10. Murai S. GIS Work Book: Fundamental Practical Course [текст]: учебное пособие / S. Murai. - Japan: Japan Association of Surveyors, 1999. - 74 p.
11. Grady, L., and Funka-Lea, G. 2004. Multi-label image segmentation for medical applications based on graph-theoretic electrical potentials. In ECCV Workshops CVAMIA and MMBIA, 230-245.
12. Richard Barbieri, Harry Montgomery и др. Algorithm Technical Background Document // MODIS ATBD: THEORETICAL BASIS 1, 1997. - P.27 - 29
13. Michael Matson, Jeff Dozier. Identification of Subresolution High Temperature Sources Using a Thermal IR Sensor // Photogrammetic Engineering and Remote Sensing №9, 1991 стр.1311-1318
14. Грузман И.С. и др. Цифровая обработка изображений в информационных системах. - Новосибирск: НГТУ, 2002. - 352 с.
15. Верещака Т.В., Зверев А.Т. Визуальные методы дешифрирования. - М.: Недра, 1990. - 341 с.
16. Трофимова, Н.В. Методика создания ГИС проекта / Н.В. Трофимова, 2006. - 50 с.
17. Рис, У. Физические основы дистанционного зондирования. Учебное пособие / У. Рис - М.: Техносфера, 2008. - 312с.
18. Грузман, И.С. Цифровая обработка изображений в информационных системах / И.С. Грузман. - Новосибирск: НГТУ, 2002. - 352 с.
19. Верещака, Т.В. Визуальные методы дешифрирования / Т.В. Верещака, А.Т. Зверев. - М.: Недра, 1990. - 341 с.
20. Гарбук, С.В. Космические системы дистанционного зондирования Земли / С.В. Гарбук, В.Е. Гершензон. - М.: Сканэкс, 1997. - 296 с
21. Прэтт, У. Цифровая обработка изображений / У. Прэтт. - М.: Мир, 1982.
22. Loboda, T. Regionally adaptable dNBR-based algorithm for burned area mapping from MODIS data / T. Loboda, K. J. O”Neal, I. Csiszar. - M: Science Direct, 2007.
23. Мураховский В.И. Компьютерная графика [текст]: учебник / В.И. Мураховский; Под. Ред. С.В. Симоновича. - М.: Аст-Пресс СКД, 2002. - 640 с.
Приложение
Компьютерный код программы "Contour" в среде "Delphi".
unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, GR32_Layers, GR32_Polygons, StdCtrls, GR32_Image, GR32, ExtCtrls, Menus, ExtDlgs, Gauges,JPEG, Grids, ActnPopup, ComCtrls, Tabs, DockTabSet;
type
TFormMain = class (TForm)
ImgView321: TImgView32; ScaleBar: TScrollBar; OptionsImPanel: TPanel; ScaleLabel: TLabel; ScaleCombo: TComboBox; MainMenu: TMainMenu; FileN: TMenuItem; OpenN: TMenuItem; ExitN: TMenuItem; OpenPictureDialog1: TOpenPictureDialog; CloseN: TMenuItem; ScalePanel: TPanel; SystemPanel: TPanel; XYPanel: TPanel; RGBPanel: TPanel; Grid: TStringGrid; NewPolButton: TButton; EditN: TMenuItem; DelAllN: TMenuItem; DelLastN: TMenuItem; N7: TMenuItem; ProzrCont: TScrollBar; DelPolButton: TButton; Label1: TLabel; SavePictureDialog1: SavePictureDialog; SaveContN: TMenuItem; N2: TMenuItem; OpenContN: TMenuItem FillPanel: TPanel; AddDelPanel: TPanel; Label2: TLabel; TochekPanel: TPanel; RadioVidCon: TRadioGroup; ChangePanel: TPanel; N1: TMenuItem; AutoOptPanel: TPanel; Label8: TLabel; Label5: TLabel; EditR: TEdit; EditG: TEdit; EditB: TEdit; Label9: TLabel; Panel1: TPanel; Panel2: TPanel; ColorDialog1: TColorDialog; Button1: TButton; Label10: TLabel; Shape1: TShape; WxWyPanel: TPanel; Panel4: TPanel; Label6: TLabel; UpLeftX: TEdit; Panel5: TPanel; Label7: TLabel; UpLeftY: TEdit; Panel6: TPanel; Label3: TLabel; RazrEdit: TEdit; SaveTextFileDialog1: TSaveTextFileDialog; Memo1: TMemo; Button2: TButton;
procedure Button1Click (Sender: TObject);
procedure DelAllNClick (Sender: TObject); procedure OpenContNClick (Sender: TObject); procedure SaveContNClick (Sender: TObject); procedure DelLastNClick (Sender: TObject); procedure DelPolButtonClick (Sender: TObject); procedure GridMouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure GridMouseUp (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure rozrContChange (Sender: TObject); procedure CloseNClick (Sender: TObject); procedure GridSelectCell (Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); procedure GridKeyDown (Sender: TObject; var Key: Word; Shift: TShiftState); procedure NewPolButtonClick (Sender: TObject); procedure ImgView321MouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer; Layer: TCustomLayer); procedure FormCreate (Sender: TObject); procedure OpenNClick (Sender: TObject); procedure ScaleComboChange (Sender: TObject); procedure ScaleBarChange (Sender: TObject); procedure ImgView321MouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer; Layer: TCustomLayer); procedure DelContour (nomer: integer); private Polygon: array [1.1000] of TPolygon32; Outline: TPolygon32; procedure Build; procedure Draw (sloi: integer; proz: integer); procedure Left; procedure Right; procedure Up; procedure Down; function ColorSrav (colFun: TColor32): boolean; function StopUp: boolean; function StopLeft: boolean; function StopDown: boolean; function StopRight: boolean; procedure OtrisovkaAuto;
var
FormMain: TFormMain; CurDir: string; p: TPoint; conty: array [1.1000] of TBitmapLayer; id: word; points: word; colg,rowg: integer; mm: boolean;
scrollfill: boolean; xt,yt: array [0.1000] of integer; dlina: array [1.1000] of real;
square: array [1.1000] of real; prozra: array [1.1000] of integer; // dot: array [1.10000,1.10000] of integer; dot: array of array of array of integer; x_g,y_g: integer; col,colP: TColor32; StopperSlayer: boolean;
procedure Area; var i: Integer; begin xt [0]: = xt [points]; yt [0]: = yt [points]; square [id]: = 0; i: = 0; repeat square [id]: = square [id] + (xt [i] +xt [i+1]) * (yt [i] - yt [i+1]); i: = i+1; until not (i<=points-1); square [id]: = 0.5*Abs (square [id]); end; procedure perimetr; vari: integer; begindlina [id]: =0; for i: = 1 to points-1 do dlina [id]: =dlina [id] + sqrt ( (xt [i] - xt [i+1]) * (xt [i] - xt [i+1]) + (yt [i] - yt [i+1]) * (yt [i] - yt [i+1])); dlina [id]: =dlina [id] +sqrt ( (xt [1] - xt [points]) * (xt [1] - xt [points]) + (yt [1] - yt [points]) * (yt [1] - yt [points])); end;
procedure Delay (ms: longint); var TheTime: LongInt; begin TheTime: = GetTickCount + ms; while GetTickCount < TheTime do Application. ProcessMessages; end;
procedure TFormMain. Build; var TmpPoly: TPolygon32; begin Outline. Free; Outline: = nil; TmpPoly: = Polygon [id]. Outline; Outline: = TmpPoly. Grow (Fixed (0), 0); Outline. FillMode: = pfWinding; TmpPoly. Free;
end; procedure TFormMain. DelAllNClick (Sender: TObject); vari: integer; begin for i: = 1 to id do begin Grid. Rows [i]. Clear (); Polygon [id]. Clear; Conty [i]. Free; end; id: =0; DelPolButton. Enabled: =False; end;
procedure TFormMain. DelLastNClick (Sender: TObject); begin if (id<>0) then DelContour (id); end; procedure TFormMain. DelPolButtonClick (Sender: TObject);
begin DelContour (rowg); end;
procedure TFormMain. Draw (sloi: integer; proz: integer); begin Conty [sloi]. Bitmap. BeginUpdate; Conty [sloi]. Bitmap. Clear ($00); Conty [sloi]. Bitmap. Draw (0, 0, Conty [sloi]. Bitmap); Polygon [sloi]. DrawFill (Conty [sloi]. Bitmap, SetAlpha (clBlue32, proz)); Polygon [sloi]. DrawEdge (Conty [sloi]. Bitmap, SetAlpha (clBlack32, 255)); Conty [sloi]. Bitmap. EndUpdate; Conty [sloi]. Bitmap. Changed; ImgView321. Refresh; end; procedure TFormMain. SaveContNClick (Sender: TObject); var: integer; bm: TBitmap32; fFileHandle: TextFile; begin bm: = TBitmap32. Create (); bm. SetSize (ImgView321. Bitmap. Width, ImgView321. Bitmap. Height); bm. FillRect (0,0,bm. Width,bm. Height,$0f000000); for i: = 1 to id do conty [i]. bitmap. DrawTo (bm); if SavePictureDialog1. Execute then bm. SaveToFile (SavePictureDialog1. FileName); memo1. lines. Add (razredit. text); memo1. lines. Add ('0.0'); memo1. lines. Add ('0.0'); memo1. lines. Add ('-razredit. text); memo1. lines. Add (UpLeftX. text); memo1. lines. Add (UpLeftY. text); memo1. Lines. SaveToFile ('c: \test. jgw'); memo1. Clear; end; procedure TFormMain. NewPolButtonClick (Sender: TObject); varswap: integer; beginscrollfill: =true; if ( (points>=3) or (id=0)) and (radiovidcon. ItemIndex=0) then Begin inc (id); conty [id]: =TBitmapLayer. Create (ImgView321. Layers); conty [id]. Bitmap. SetSizeFrom (ImgView321. Bitmap); conty [id]. Bitmap. DrawMode: = dmBlend; conty [id]. Location: = FloatRect (0, 0, conty [id]. Bitmap. Width, conty [id]. Bitmap. Height); conty [id]. Scaled: =True; {conty [id]. Bitmap. MoveTo (0,0); conty [id]. Bitmap. pencolor: =Color32 (clBlack);
conty [id]. bitmap. LineToS (200, 200); }Polygon [id]: = TPolygon32. Create; Polygon [id]. NewLine; points: =0; Grid. Cells [0, id]: = (IntToStr (id)); Grid. Cells [1, id]: ='set ' + IntToStr (3-points) + ' dots'; Grid. Cells [2, id]: ='set ' + IntToStr (3-points) + ' dots'; prozra [id]: =ProzrCont. Position; end; end;
procedure TFormMain. FormCreate (Sender: TObject); beginStopperSlayer: =true;
GetDir (0,CurDir); id: =0; points: =0; mm: =true; DelPolButton. enabled: =false;
rowg: =0; colg: =0; scrollfill: =true; Grid. Cols [0]. Add ('Контур'); Grid. Cols [1]. Add ('Периметр'); Grid. Cols [2]. Add ('Площадь'); end; procedure TFormMain. GridKeyDown (Sender: TObject; var Key: Word;
Shift: TShiftState);
var i: integer; begin if (Key = VK_DELETE) then DelContour (rowg);
if (Key = VK_INSERT) and (Grid. Cells [colg,rowg] <>'') then begin draw (Rowg,1); Delay (50); draw (Rowg, 200); Delay (50); draw (Rowg,Prozra [rowg]); Delay (50); end; end;
procedure TFormMain. GridMouseDown (Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); beginmm: =true; end; procedure TFormMain. GridMouseUp (Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
beginmm: =false; end; procedure TFormMain. GridSelectCell (Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); begin scrollfill: =false; colg: =ACol; rowg: =ARow;
DelPolButton. Enabled: =True;
if Grid. Cells [Colg,Rowg] <>'' then begin while mm=True do begin draw (Rowg,1); Delay (50); draw (Rowg, 200); Delay (50); draw (Rowg,Prozra [rowg]); Delay (50); end; end; end;
procedure TFormMain. Left; var i,j: integer; beginrepeat for j: = 0 to mgview321. Bitmap. Height do begin for i: = 0 to imgview321. Bitmap. Width-1 do begin if (dot [id, i,j] =0) and (dot [id, i+1,j] =1) then begin if ColorSrav (ImgView321. Bitmap. PixelS [i,j]) =True then begin dot [id, i,j]: =1; if i=0 then dot [id, i,j]: =2; end else dot [id, i,j]: =2; end; end; end;
until StopLeft=False; end; procedure TFormMain. Right; var i,j: integer;
beginrepeat for j: = 1 to imgview321. Bitmap. Height do begin for i: = imgview321. Bitmap. Width downto 1 do begin if (dot [id, i,j] =0) and (dot [id, i-1,j] =1) then begin if lorSrav (ImgView321. Bitmap. PixelS [i,j]) =True then begin dot [id, i,j]: =1; if i=imgview321. Bitmap. Width then dot [id, i,j]: =2; end else dot [id, i,j]: =2; end; end; end; until StopRight=False; end; procedure TFormMain. Up; var i,j: integer; beginrepeat for i: = 0 to imgview321. Bitmap. Width do begin for j: = 0 to imgview321. Bitmap. Height do begin if (dot [id, i,j] =0) and (dot [id, i,j+1] =1) then begin if ColorSrav (ImgView321. Bitmap. PixelS [i,j]) =True then begin dot [id, i,j]: =1; if j=0 then dot [id, i,j]: =2; end else dot [id, i,j]: =2; end; end; end; until StopUp=False; end; procedure TFormMain. Down; var i,j: integer; beginrepeat for i: = 1 to imgview321. Bitmap. Width do begin for j: = imgview321. Bitmap. Height downto 1 do begin if (dot [id, i,j] =0) and (dot [id, i,j-1] =1) then begin if ColorSrav (ImgView321. Bitmap. PixelS [i,j]) =True then begin dot [id, i,j]: =1; if j=imgview321. Bitmap. Height then dot [id, i,j]: =2; end else dot [id, i,j]: =2; end; end; end; until StopDown=False; end; function TFormMain. ColorSrav (colFun: TColor32): boolean; beginif (abs (TColor32Entry (ColFun). R-TColor32Entry (Col). R) <=StrtoInt (EditR. Text)) and (abs (TColor32Entry (ColFun). G-TColor32Entry (Col). G) <=StrtoInt (EditG. Text)) and (abs (TColor32Entry (ColFun). B-TColor32Entry (Col). B) <=StrtoInt (EditB. Text)) then Result: = True else Result: = False; end; function TFormMain. StopDown: boolean; vari,j,k: integer; begin for i: = 1 to imgview321. Bitmap. Width do begin for j: = imgview321. Bitmap. Height downto 1 do begin if (dot [id, i,j] =0) and (dot [id, i,j-1] =1) then k: =1; end; end; if k=1 then Result: =True else Result: =False; end; function TFormMain. StopUp: boolean; vari,j,k: integer; begin for i: = 1 to imgview321. Bitmap. Width do begin for j: = 1 to imgview321. Bitmap. Height do begin if (dot [id, i,j] =0) and (dot [id, i,j+1] =1) then k: =1; end; end; if k=1 then Result: =True else Result: =False; end; function TFormMain. StopRight: boolean; vari,j,k: integer; begin for j: = 1 to imgview321. Bitmap. Height do begin for i: = imgview321. Bitmap. Width downto 1 do begin if (dot [id, i,j] =0) and (dot [id, i-1,j] =1) then k: =1; end; end; if k=1 then Result: =True else Result: =False; end; function TFormMain. StopLeft: boolean; vari,j,k: integer; begin for j: = 1 to imgview321. Bitmap. Height do begin for i: = 1 to imgview321. Bitmap. Width-1 do begin if (dot [id, i,j] =0) and (dot [id, i+1,j] =1) then k: =1; end; end; if k=1 then Result: =True else Result: =False; end; procedure TFormMain. OtrisovkaAuto; var i,j: integer; beginfor i: = 0 to conty [id]. Bitmap. Width do begin for j: = 0 to conty [id]. Bitmap. Height do begin if dot [id, i,j] =2 then conty [id]. Bitmap [i,j]: = Color32 (0,255,0); end; conty [id]. Changed; end; end; procedure TFormMain. ImgView321MouseDown (Sender: TObject; Button: MouseButton; Shift: TShiftState; X, Y: Integer; Layer: TCustomLayer); var i,j,t: integer; l: real; beginif RadioVidCon. ItemIndex=1 thenbegin if Button = mbLeft then begin if (p. X>=1) and (p. X<imgview321. Bitmap. Width) and (p. Y>=1) and p. Y<imgview321. Bitmap. Height) then begin x_g: =p. X; y_g: =p. Y; col: = ImgView321. Bitmap. PixelS [x_g,y_g]; setlength (dot, id+1, imgview321. Bitmap. Width+1, imgview321. Bitmap. Height+1);
conty [id]: =TBitmapLayer. Create (ImgView321. Layers); conty [id]. Bitmap. SetSizeFrom (ImgView321. Bitmap); conty [id]. Bitmap. DrawMode: = dmBlend; conty [id]. Location: = FloatRect (0, 0, conty [id]. Bitmap. Width, onty [id]. Bitmap. Height); conty [id]. Scaled: =True; dot [id,x_g,y_g]: =1 repeat Up; Right; Down; Left; until (StopUp=False) and (StopLeft=False) and (StopRight=False) and StopDown=False); t: =0; for i: = 0 to imgview321. Bitmap. Width do begin for j: = 0 to imgview321. Bitmap. Height do begin if dot [id, i,j] =1 then inc (t); end; end; if t>3 then begin Grid. Cells [0, id]: = (IntToStr (id)); Grid. Cells [2, id]: = (IntToStr (t*strtoint (RazrEdit. Text))); l: =2*sqrt (Pi*t); Grid. Cells [1, id]: = (IntToStr (round (l))); end else begin showmessage ('В области менее трех точек. '); conty [id]. Free; dot [id]: =nil; id: =id-1; end; OtrisovkaAuto; end else showmessage ('Попали в (за) край снимка! '); end; if Button = mbRight then // условие на левый клик Begin conty [id]. Free; dot [id]: =nil; Grid. Rows [id]. Clear (); if id>=1 then id: =id-1 else if id=0 then id: =0; end; end; if RadioVidCon. ItemIndex=0 then Begin if (id>0) then Begin if (p. X<ImgView321. Bitmap. Width) and (p. Y < ImgView321. Bitmap. Height) and (p. X>0) and (p. Y>0) and ( (xt [points] <>p. X) and (yt [points] <>p. Y)) then Begin if Button = mbLeft then Begin Polygon [id]. Add (FixedPoint (p. X, p. Y)); inc (points); TochekPanel. Caption: ='Вершин: '+ IntToStr (points); xt [points]: =p. X; yt [points]: =p. Y; if points >=3 then begin perimetr; area; Grid. Cells [1, id]: =FloatToStr (dlina [id] *StrToFloat (RazrEdit. Text));
rid. Cells [2, id]: =FloatToStr (square [id] *StrToFloat (RazrEdit. Text) *StrToFloat (RazrEdit. Text)); end else DelContour (id); End; Build; Draw (id,ProzrCont. Position); end; end; end; procedure TFormMain. ImgView321MouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer; Layer: TCustomLayer); var col: TColor32; begin p. x: = X; p. y: = Y; p: =ImgView321. ControlToBitmap (p); col: = ImgView321. Bitmap. PixelS [p. X,p. Y]; if (p. X<=ImgView321. Bitmap. Width) and (p. Y <= ImgView321. Bitmap. Height)
and (p. X>=0) and (p. Y>=0) then begin XYPanel. Caption: =' [x,y] ='+' ['+IntToStr (p. X) +','+IntToStr (p. Y) +'] ';
WxWyPanel. Caption: = ' [Wx,Wy] ='+' ['+IntToStr (StrToInt (RazrEdit. Text) *p. X+StrToInt (UpLeftX. text)) +
','+IntToStr (StrToInt (RazrEdit. Text) *p. Y+StrToInt (UpLeftY. text)) +'] ';
RGBPanel. Caption: =' [R,G,B] ='+ ' ['+ IntToStr (TColor32Entry (Col). R) +','+
IntToStr (TColor32Entry (Col). G) +','+IntToStr (TColor32Entry (Col). B) + '] ';
if id >=1 then end else begin XYPanel. Caption: =' [x,y] = [?,?] '; WXWYPanel. Caption: =' [Wx,Wy] = [?,?] '; RGBPanel. Caption: =' [R,G,B] = [?,?,?] '; end; end; procedure TFormMain. OpenContNClick (Sender: TObject); beginwith OpenPictureDialog1 do if Execute then begin conty [100]: =TBitmapLayer. Create (ImgView321. Layers); conty [100]. Bitmap. LoadFromFile (FileName); if (conty [100]. Bitmap. Width=imgview321. Bitmap. Width) and (conty [100]. Bitmap. Height=imgview321. Bitmap. Height) then begin conty [100]. Bitmap. DrawMode: = dmBlend; conty [100]. Location: = FloatRect (0, 0, conty [100]. Bitmap. Width, onty [100]. Bitmap. Height); conty [100]. Scaled: =True; end else begin conty [100]. free; showmessage ('Размеры изображений контуров и снимка не совпадают. '); end; end; end; procedure TFormMain. OpenNClick (Sender: TObject); beginOpenPictureDialog1. InitialDir: =CurDir; with OpenPictureDialog1 do if Execute then begin ImgView321. Bitmap. LoadFromFile (FileName); end; NewPolButton. Enabled: =True; DelPolButton. Enabled: =True; end; procedure TFormMain. Button1Click (Sender: TObject); vargog: TColor32; beginColorDialog1. Execute; gog: =ColorDialog1. Color; Shape1. Brush. Color: = gog; end; procedure TFormMain. CloseNClick (Sender: TObject); vari: integer; begin for i: = 1 to id do begin Grid. Rows [i]. Clear (); Conty [i]. Free; // нет слоя Polygon [i]. Clear; // нет полигона end; ImgView321. Bitmap. Clear (clSilver); id: =0; points: =0; NewPolButton. Enabled: =False; DelPolButton. Enabled: =False; end; procedure TFormMain. ScaleBarChange (Sender: TObject); varNewScale: real; begin NewScale: = ScaleBar. Position/100; ScaleBar. Repaint; ImgView321. Scale: = NewScale; ScaleCombo. Text: = IntToStr (Round (NewScale*100)) +'%'; end; procedure TFormMain. ScaleComboChange (Sender: TObject); var S: string; I: Integer; begin S: = ScaleCombo. Text; S: = StringReplace (S, '%', '', [rfReplaceAll]); S: = StringReplace (S, ' ', '', [rfReplaceAll]); if S = '' then Exit; I: = StrToIntDef (S, - 1); if (I < 1) or (I > 1000) then I: = Round (ImgView321. Scale * 100) else ImgView321. Scale: = I / 100; ScaleCombo. Text: = IntToStr (I) + '%'; ScaleCombo. SelStart: = Length (ScaleCombo. Text) - 1; ScaleBar. Position: = I; end; procedure TFormMain. ProzrContChange (Sender: TObject); begin if (scrollfill=true) and (id<>0) then begin Draw (id,ProzrCont. Position); prozra [id]: =ProzrCont. Position; end; if scrollfill=false and (Grid. Cells [Colg,Rowg] <>'') then begin Draw (rowg,ProzrCont. Position); prozra [rowg]: =ProzrCont. Position; end; end; procedure TFormMain. DelContour (nomer: integer); var i: integer; begin if (Grid. Cells [0,nomer] <>'') and (nomer<>id) then begin for i: =nomer to id-1 do begin Grid. Rows [i]: =Grid. Rows [i+1]; Polygon [i]: =Polygon [i+1]; prozra [i]: =prozra [i+1]; end; conty [id]. Free; Grid. Rows [id]. Clear (); for i: =nomer to id-1 do begin draw (i,ProzrCont. Position); Grid. Cells [0, i]: =IntToStr (i); end; id: =id-1; end else begin if nomer=id then Polygon [id]. Clear; draw (id,ProzrCont. Position); points: =0; Grid. Cells [1, id]: ='set ' + IntToStr (3-points) + ' dots'; Grid. Cells [2, id]: ='set ' + IntToStr (3-points) + ' dots'; end; end; end.