Мониторинг биосферы и дистанционное зондирование. Обработка растровых изображений

Методы обработки растровых изображений (кластеризация, пороговая и интерактивная сегментация). Разработка программного модуля для системы мониторинга биосферы и дистанционного зондирования. Создание пользовательского интерфейса программного модуля.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 29.04.2015
Размер файла 2,2 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ

СЕВАСТОПОЛЬСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

Институт информационных технологий и управления в технических системах

Кафедра ИС

Расчетно-графическая работа

Мониторинг биосферы и дистанционное зондирование. Обработка растровых изображений

Выполнил: студент 441 класса

Авдошкин А.С.

Проверил: преподаватель кафедры КЭЭМ

Сырых О.А.

Севастополь 2015 год

Содержание

  • Введение
  • Раздел 1. Методы обработки изображений
    • 1.1 Обработка изображений. Сегментация
    • 1.2 Методы сегментации. Кластеризация
    • 1.3 Пороговая сегментация
    • 1.4 Метод выращивания регионов
    • 1.5 Интерактивная сегментация. Волшебная палочка
    • 1.6 Интерактивная сегментация. Умные ножницы
    • Выводы раздела 1
  • Раздел 2. Разработка программного модуля для обработки растровых изображений
    • 2.1 Выбор среды разработки
    • 2.2 Создание пользовательского интерфейса программного модуля
    • 2.3 Функции приложения. Пороговая сегментация
    • 2.4 Кластеризация изображения. Метод разрастания областей
    • 2.5 Интерактивная сегментация. «Волшебная палочка»
    • 2.6 Интерактивная сегментация. Умные ножницы
    • Выводы раздела 2
  • Вывод
  • Список использованной литературы
  • Приложение
  • Введение
  • Актуальность темы. Широкое применение информационных технологий затронуло в настоящее время практически все сферы производственной деятельности. Во многих отраслях последние достижения этого направления связаны с началом применения географических информационных систем для решения разного рода производственных задач. Но одной из наиболее важных частей ГИС являются данные, которые составляют основу системы. Одним из методов получения геоданных является дистанционное зондирование земной поверхности. Различные средства дистанционного зондирования Земли (ДЗЗ) получили в настоящее время широкое применение во всем мире.
  • Получаемая таким образом информация используется для решения многочисленных хозяйственных и научных задач мониторинга природной среды. На этой основе достигается ощутимое повышение эффективности производственной деятельности в таких областях, как общегеографическое и тематическое картографирование, землеустройство и землепользование и других. Однако данные полученные путем ДЗЗ нуждаются в обработке так как только после того как будет проведена обработка, их можно использовать для создания качественной картографической продукции.
  • Цели и задачи работы. Целью данной расчетно-графической работы является получение знаний и навыков в приемах обработки растровых изображений, получение представления о различных методах сегментации, как одного из видов предварительной обработки изображений в системах распознавания образов.
  • Для достижения поставленной цели необходимо решить следующие задачи:

1. Ознакомиться с теоретическими основами обработки изображений;

2. Разработать программный модуль для обработки растровых изображений.

Структура работы. Данная работа состоит из пояснительной записки, включающей в себя введение, два раздела, список использованной литературы, и приложения.

В первом разделе даются краткие теоретические сведения о методах обработки изображений.

Во втором разделе описывается создание и функциональные возможности программного модуля по обработке изображений.

Раздел 1. Методы обработки изображений

1.1 Обработка изображений. Сегментация

Сегментацией изображения называется разбиение изображения на непохожие по некоторому признаку области. Предполагается, что области соответствуют реальным объектам, или их частям, а границы областей соответствуют границам объектов. Сегментация играет важную роль в задачах обработки изображений и компьютерного зрения.

Методы сегментации можно разделить на два класса: автоматические - не требующие взаимодействия с пользователем и интерактивные - использующие пользовательский ввод непосредственно в процессе работы. В данной статье рассматриваются только автоматические методы.

Задачи автоматической сегментации делятся на два класса:

- выделение областей изображения с известными свойствами;

- разбиение изображения на однородные области.

Между этими двумя постановками задачи есть принципиальная разница. В первом случае задача сегментации состоит в поиске определенных областей, о которых имеется априорная информация (например, мы знаем цвет, форму областей, или интересующие нас области представляют собой изображения известного объекта). Методы этой группы узко специализированы для каждой конкретной задачи. Сегментация в такой постановке используется в основном в задачах машинного зрения (анализ сцен, поиск объектов на изображении).

Во втором случае никакая априорная информация о свойствах областей не используется, зато на само разбиение изображения накладываются некоторые условия (например, все области должны быть однородны по цвету и текстуре). Так как при такой постановке задачи сегментации не используется априорная информация об изображенных объектах, то методы этой группы универсальны и применимы к любым изображениям. В основном сегментация в этой постановке применяется на начальном этапе решения задачи, для того чтобы получить представление изображения в более удобном виде для дальнейшей работы.

Вначале рассмотрим постановку задачи сегментации, как разбиения изображения на однородные области. Постановка задачи сегментации, как разбиения изображения на однородные области возникла раньше, чем задача выделения областей изображения с известными свойствами, и методы этой группы на данный момент хорошо разработаны.

Ясно, что задача разбиения изображения на однородные области поставлена некорректно. Далеко не всегда для изображения есть единственно «правильная» сегментация, и далеко не всегда задача сегментации имеет единственное решение. По той же причине нет и объективного критерия оценки качества разбиения изображения.

Поскольку сегментация обычно используется не самостоятельно, а как часть некоторой системы (например, системы машинного зрения), то с практической точки зрения, качество работы метода оценивается исходя из работы системы в целом. Поэтому один и тот же метод сегментации может оказаться хорошим для одной задачи и плохим для другой.

Таким образом, сегментацией изображения называется разбиение изображения на непохожие по некоторому признаку области. Разные методы сегментации ориентированы на разные свойства разбиения. Поэтому при выборе метода сегментации для решения конкретной задачи, следует определиться, какие свойства разбиения действительно важны.

1.2 Методы сегментации. Кластеризация

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

В качестве признаков точки изображения можно использовать представление ее цвета в некотором цветовом пространстве, примером метрики (меры близости) может быть евклидово расстояние между векторами в пространстве признаков. Тогда результатом кластеризации будет квантование цвета для изображения. Задав отображение в пространство признаков, можно воспользоваться любыми методами кластерного анализа. Наиболее популярные методы кластеризации, используемые для сегментации изображений - к-средних.

K-средних - это итеративный метод, который используется, чтобы разделить изображение на K кластеров. Базовый алгоритм приведён ниже:

- выбрать K центров кластеров, случайно или на основании некоторой эвристики;

- поместить каждый пиксель изображения в кластер, центр которого ближе всего к этому пикселю;

- заново вычислить центры кластеров, усредняя все пиксели в кластере;

- повторять шаги 2 и 3 до сходимости (например, когда пиксели будут оставаться в том же кластере).

Здесь в качестве расстояния обычно берётся сумма квадратов или абсолютных значений разностей между пикселем и центром кластера. Разность обычно основана на цвете, яркости, текстуре и местоположении пикселя, или на взвешенной сумме этих факторов. K может быть выбрано вручную, случайно или эвристически.

Этот алгоритм гарантированно сходится, но он может не привести к оптимальному решению. Качество решения зависит от начального множества кластеров и значения K.

Основная проблема методов кластеризации, состоит в том, что пространственное расположение точек либо не учитывается совсем, либо учитывается косвенно (например, используя координаты точки как один из признаков). Поэтому обычно после кластеризации точек изображения проводят процедуру выделения связных компонент.

Таким образом, методы кластеризации плохо работают на зашумленных изображениях: часто теряют отдельные точек регионов, образуется много мелких регионов.

1.3 Пороговая сегментация

Пороговая обработка, вероятно, самый простой метод сегментации, что привлекает к нему большое внимание специалистов. Метод ориентирован на обработку изображений, отдельные однородные участки которых различаются средней яркостью. Простейшим и вместе с тем часто применяемым видом сегментации является бинарная сегментация, когда имеется только два типа однородных участков. При этом преобразование каждой точки исходного изображения x(i1,i2) в выходное y(i1,i2) выполняется по правилу (1.1).

(1.1.)

Где x0 - единственный параметр обработки, называемый порогом. Уровни выходной яркости y0 и y1, могут быть произвольными, они лишь выполняют функции меток, при помощи которых осуществляется разметка получаемой карты - отнесение ее точек к классам H0 или H1 соответственно. Если образуемый препарат подготавливается для визуального восприятия, то часто их значения соответствуют уровням черного и белого. Если существует более двух классов, то при пороговой обработке должно быть задано семейство порогов, отделяющих яркости различных классов друг от друга.

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

1.4 Метод выращивания регионов

Методы выращивания регионов основаны на следующей идее. Сначала по некоторому правилу выбираются центры регионов, к которым поэтапно присоединяются соседние точки, удовлетворяющих некоторому критерию. Процесс выращивания регионов останавливается, когда ни одна точка изображения не может быть присоединена ни к одному региону.

В качестве входных данных этот метод принимает изображений и набор семян. Семена отмечают объекты, которые нужно выделить. Области постепенно разрастаются, сравнивая все незанятые соседние пиксели с областью. Разность между яркостью пикселя и средней яркостью области используется как мера схожести. Пиксель с наименьшей такой разностью добавляется в соответствующую область. Процесс продолжается, пока все пиксели не будут добавлены в один из регионов.

Метод разрастания областей из семян требует дополнительного ввода. Результат сегментации зависит от выбора семян. Шум на изображении может вызвать то, что семена плохо размещены. Метод разрастания областей без использования семян - это изменённый алгоритм, который не требует явных семян. Он начинает с одной области A1 - пиксель, выбранный здесь незначительно влияет на конечную сегментацию. На каждой итерации он рассматривает соседние пиксели так же, как метод разрастания областей с использованием семян. Но он отличается тем, что если минимальная меньше, чем заданный порог T, то он добавляется в соответствующую область Aj. В противном случае пиксель считается сильно отличающимся от всех текущих областей Ai и создаётся новая область A{n+1}, содержащая этот пиксель.

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

1.5 Интерактивная сегментация. Волшебная палочка

В последнее время стало ясно, что современные автоматические алгоритмы не способны решать произвольные задачи сегментации с гарантированным результатом. Более того, по всей видимости, в ближайшее время такие алгоритмы не появятся. Поэтому всё большее и большее внимание стало уделяться интерактивной сегментации изображений.

В интерактивной сегментации изображений обычно рассматривается задача разбиения только на 2 области - объект и фон (разбиение на большее число областей получается многократным разбиением на 2 области).

Волшебная палочка является, наверное, самым известным и, возможно, самым простым алгоритмом интерактивной сегментации изображений. Она встроена практически в каждый современный графический редактор.

Пользователь указывает пиксель объекта и задаёт порог. Алгоритм относит к объекту область, включающую заданный пиксель, и цвета всех пикселей которой отличаются от цвета заданного пикселя не больше, чем на данный порог. По указанию пользователя можно выделить только связную подобласть, включающую заданный пиксель.

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

В реальности для сегментации сложных объектов пользователю приходится выбрать маленький порог, и по очереди указывать алгоритму множество пикселей объекта, добавляя при этом маленькие кусочки к текущей маске объекта.

Таким образом, алгоритм «Волшебная палочка» позволяет производить выделение отдельных сегментов изображения при условии что правильно выбран порог, и цвета фона и выделяемого фрагмента различны.

1.6 Интерактивная сегментация. Умные ножницы

Алгоритм "умные ножницы" (англ. intellegent scissors), представленный в 1996 году, быстро завоевал популярность и был встроен в самый мощный и широко распространенный редактор фотоизображений Adobe Photoshop под именем "магнитное лассо" (англ.magnetic lasso).При использовании "умных ножниц" пользователь обводит границу между объектом и фоном. Пользовательуказывает точки на границе с некоторым промежутком, а "умные ножницы" проводят граничную линию между последовательно указанными точками.

Рассмотрим алгоритм проведения граничной линии от одной точки до другой, используемый "умными ножницами". Будем считать, что у нас есть изображение A с цветами пикселей A(x,y) и дана метрическая функция p(C1,C2), задающая расстояние между двумя цветами. Рассмотрим растровую решетку как граф, устроенный следующим образом. Вершинами графа служат углы пикселей, а ребрами графа - стороны пикселей. Будем считать, что пользователь в качестве последовательных граничных точек указал два угла пикселей, соответствующих вершинам графа P и Q (Рисунок 1.1).

Рисунок 1.1. Граф изображения

Каждому ребру приписывается длина, обратно зависящая от разницы между цветами пикселей, которые примыкают к ребру вычисляемая по формуле (1.2.)

(1.2.)

Где d - приписываемая длина ребра, L - геометрическая длина ребра, C1 и C2 - цвета пикселей по обе стороны от ребра, а K - некоторая константа. В качестве граничной линии на участке между граничными точками P и Q "умные ножницы" выбирают кратчайший путь на графе, т.е. последовательность ребер, соединяющих вершины P и Q и имеющих минимальную суммарную длину. Поскольку ребра, соответствующие резким цветовым перепадам, имеют меньшую приписанную длину, "умные ножницы" стремятся провести границу именно по таким ребрам.

Таким образом, «Умные ножницы» трактуют всё изображение как граф, каждая вершина которого соответствует пикселю изображения, что позволяет достаточно быстро и точно проводить интерактивную сегментацию изображения.

Выводы раздела 1

1. Сегментацией изображения называется разбиение изображения на непохожие по некоторому признаку области. Разные методы сегментации ориентированы на разные свойства разбиения. Поэтому при выборе метода сегментации для решения конкретной задачи, следует определиться, какие свойства разбиения действительно важны.

2. Методы кластеризации плохо работают на зашумленных изображениях: часто теряют отдельные точек регионов, образуется много мелких регионов.

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

4. Методы основанные на разрастании областей учитывают пространственное расположение точек напрямую и при неправильном выборе точек производит зашумление изображения.

5. Алгоритм «Волшебная палочка» позволяет производить выделение отдельных сегментов изображения при условии что правильно выбран порог, и цвета фона и выделяемого фрагмента различны.

6. «Умные ножницы» трактуют всё изображение как граф, каждая вершина которого соответствует пикселю изображения, что позволяет достаточно быстро и точно проводить интерактивную сегментацию изображения.

Раздел 2. Разработка программного модуля для обработки растровых изображений

2.1 Выбор среды разработки

В качестве среды разработке при создании приложения была использована IntelliJ IDEA 2013, так как в данной среде наиболее удобно реализована работа с языком программирования Java.

Создание программного модуля, производится при помощи библиотеки JavaFX, которую так же достаточно просто интегрировать в проект созданный при помощи данной IDE.

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

IntelliJ IDEA 2013 позволяет создавать и подключать сторонние дополнения (плагины) и добавление новых наборов инструментов что является наиболее важной опцией, для данной работы, так как позволяет с применением минимальных навыков, произвести интегрирование библиотеки для создания пользовательских интерфейсов JavaFX.

Таким образом, в качестве среды разработке при создании приложения была использована IntelliJ IDEA 2013, так как при помощи данной среды, легко можно создать графический интерфейс для работы с растровым изображением.

2.2 Создание пользовательского интерфейса программного модуля

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

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

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

Пользовательский интерфейс включающий в себя четыре основных части:

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

- панель инструментов расположенная в левой части окна, оснащена кнопками для выбора одного из четырех инструментов: прямоугольная область, выбор, линейка и разрез;

- правая информационная панель, показывающая информацию о размере и формате файла, а так же отображающая гистограммы, и разрез яркости;

- центральная рабочая область. Область где будет находиться основное изображение подлежащее обработке.

Пользовательский интерфейс данного приложения представлен на рисунке 2.1.

Рисунок 2.1 Пользовательский интерфейс

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

2.3 Функции приложения. Пороговая сегментация

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

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

Результаты выполнения пороговой сегментации представлен на Рисунках 2.2 - 2.3.

Рисунок 2.2 Исходное изображение

Рисунок 2.3 Результат пороговой сегментации

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

2.4 Кластеризация изображения. Метод разрастания областей

При помощи редактора кода, были добавлены подпункты меню «Кластеризация» и «Разрастание областей». Данные подпункты включают в себя функции для сегментации изображения соответствующими методами.

Алгоритм для реализации кластеризации представлен в подпункте 1.2.данной работы. Результат кластеризации представлен на рисунке 2.4.

Рисунок 2.4. Результат кластеризации

Алгоритм для сегментации методом разрастания из семян основаны на следующей идее. Сначала по некоторому правилу выбираются центры регионов, к которым поэтапно присоединяются соседние точки, удовлетворяющих некоторому критерию. Процесс выращивания регионов останавливается, когда ни одна точка изображения не может быть присоединена ни к одному региону. Результат выполнения метода представлен на рисунке 2.5.

Рисунок 2.5 Метод разрастания из семян

Таким образом, методы сегментации основанные на кластеризации и разрастании областей, позволяют, произвести более точное разбиение изображения на регионы, в зависимости от какого либо заданного признака чем метод пороговой сегментации.

2.5 Интерактивная сегментация. «Волшебная палочка»

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

Действие алгоритма на каждом шаге происходит следующим образом: пользователь указывает некоторую точку объекта, и алгоритм выделяет окрестные пиксели с похожим цветом. В большинстве случаев, а именно, когда цвет объекта сколь-нибудь значительно варьируется, пользователь должен проделать эту операцию несколько раз: после каждого шага выделенная область добавляется к объекту.

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

Рисунок 2.6 Результат выполнения «Волшебная палочка»

Таким образом, алгоритм «волшебная палочка» позволяет пользователю самостоятельно определять регионы которые необходимо отделить от фона.

2.6 Интерактивная сегментация. Умные ножницы

Одним из наиболее эффективных алгоритмов интерактивной сегментации является алгоритм «умные ножницы». Который позволяет пользователю задавать лишь приблизительные границы области, сам же алгоритм, делает эти границы наиболее оптимальными. Работа алгоритма основана на поиске путей во взвешенном графе что делает алгоритм, более медленным чем другие, но при этом гораздо более эффективным

Результат вырезания фрагмента, путем применения алгоритма «умные ножницы» представлен на рисунке 2.7.

Рисунок 2.7 Результат выполнения «Умные ножницы»

Таким образом, реализация алгоритма «Умные ножницы», позволяет достаточно точно проводить интерактивную сегментацию изображения, но за счет того что алгоритм работает с графом, его работа достаточно продолжительна.

Выводы раздела 2

1. В качестве среды разработке при создании приложения была использована IntelliJ IDEA 2013, так как при помощи данной среды, легко можно создать графический интерфейс для работы с растровым изображением. В соответствии с имеющимися на участке карты объектами был создан классификатор.

2. В ходе разработки программы был создан пользовательский интерфейс, включающий в себя все визуальные компоненты для основных функций приложения.

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

4. Методы сегментации основанные на кластеризации и разрастании областей, позволяют, произвести более точное разбиение изображения на регионы, в зависимости от какого либо заданного признака чем метод пороговой сегментации.

5. Алгоритм «волшебная палочка» позволяет пользователю самостоятельно определять регионы которые необходимо отделить от фона.

6. Реализация алгоритма «Умные ножницы», позволяет достаточно точно проводить интерактивную сегментацию изображения, но за счет того что алгоритм работает с графом, его работа достаточно продолжительна.

Вывод

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

Было проведено ознакомление с теоретическим материалом основ цифровой обработки изображений.

Так же был разработан программный модуль для обработки растровых изображений

Общее назначение программного средства - работа с изображением, включающая в себя такие функции как построение сегментация методом разрастания областей, кластеризация, пороговая сегментация, интерактивная сегментация с использованием алгоритмов «волшебная палочка» и «умные ножницы».

Список использованной литературы

1. Журкин И. Г., Шайтура С. В. Геоинформационные системы. - Москва: КУДИЦ-ПРЕСС, 2009. - 272 с. - ISBN 978-5-91136-065-8

2. Модели данных в ГИС. http://prezi.com/2qh0hwfnmrfq/presentation/ (15.05.2014)

3. Джеймс Гослинг.Спецификация языка Ява Изд. 3-е, испр. и доп. Под ред. Я. И. Алексеева. - М., 1928. - 800 с.

4. The Java Tutorial Second EditionМ.: «Информационные технологи», 1997. - 290 с.

5. Мэтью Мак-Дональд IntelliJIDEA 2007. Недостающее руководство IntelliJIDEA 2007. - СПб.: «БХВ-Петербург», 2007. - С. 784. - ISBN 978-5-7502-0343-3

растровое изображение кластеризация сегментация

Приложение А

Программный код

public static int setImageToClaster(ImageView v, Image im){

PixelReader reader = im.getPixelReader();

int step = 1;

int sigma = 37;

readerForClaster = reader;

int w = (int)im.getWidth();

int h = (int)im.getHeight();

WritableImage writableImage = new WritableImage(w, h);

PixelWriter writer = writableImage.getPixelWriter();

pixelWriterForClaster = writer;

int typeClasster = 0;

ArrayList<Claster> clasters = new ArrayList<Claster>();

ArrayList<Block> blocks = new ArrayList<Block>();

clasters.add(new Claster(typeClasster, Color.BLACK, 128));

int countBlock = 0;

int countIter = 0;

for(int i = 0; i < w; i+= step){

for(int j = 0; j < h; j += step){

blocks.add(new Block(typeClasster, new Index(i, j, w, h), new Index(i+step, j+step, w, h)));

clasters.get(typeClasster).setColorRGB(blocks.get(countBlock).R, blocks.get(countBlock).G, blocks.get(countBlock).B);

countBlock++;

}

}

clasters.get(0).resetRgb();

// clasters.add(new Claster(++typeClasster, Color.BLUE, 255));

int min = 300;

int index = 0;

boolean check = true;

while(check && countIter < 15){

countIter++;

clasters.add(new Claster(++typeClasster, Color.AZURE, 255));

check = false;

for(int j = 0; j < blocks.size(); j++){

int blockCenter = blocks.get(j).getValue();

min = 300;

for(int i = 0; i < clasters.size()-1; i++){

int temp = abs(((Claster)clasters.get(i)).getCenterClasster() - blockCenter);

if(min > temp){

min = temp;

index = i;

}

}

if(min > sigma){

check = true;

index = typeClasster;

}

blocks.get(j).setTYPECLASSTER(clasters.get(index).getTYPECLASSTER());

clasters.get(index).setColorRGB(blocks.get(j).R, blocks.get(j).G, blocks.get(j).B);

}

for(int i = 0; i < clasters.size(); i++){

clasters.get(i).resetRgb();

}

}

for(int j = 0; j < blocks.size(); j++){

blocks.get(j).setColor(clasters.get(blocks.get(j).getTYPECLASSTER()).color);

}

setImage(v, writableImage);

readerForClaster = null;

pixelWriterForClaster = null;

return countIter+1;

}

private static Block[][] bloksForMagic;

private static boolean isNormalIndex(int i, int j){

if((i >= 0) && (j >= 0) && (i < bloksForMagic.length) && (j < bloksForMagic[0].length)){

return true;

}

return false;

}

private static void setMagicBlock(Claster claster, int i,int j,int sigma,int step, int countRecurs){

claster.setColorRGB(bloksForMagic[i][j].R, bloksForMagic[i][j].G, bloksForMagic[i][j].B);

bloksForMagic[i][j].setTYPECLASSTER(claster.getTYPECLASSTER());

if(countRecurs < 300000){

for(int k = (-1)*step; k <= step; k+=step){

for(int s = (-1)*step; s <= step; s+=step){

if(isNormalIndex(i+k, j+s) &&!(k==0&&s==0)){

if((abs(bloksForMagic[i+k][j+s].getValue() -

bloksForMagic[i][j].getValue()) <= sigma)&&

(bloksForMagic[i+k][j+s].getTYPECLASSTER()==0)&& bloksForMagic[i+k][j+s].getValue()!=255){

bloksForMagic[i+k][j+s].setValue(bloksForMagic[i][j].getValue());

setMagicBlock(claster, i+k, j+s, sigma, step, ++countRecurs);

}

}

}

}

}

}

private static class Vertex implements Comparable{

public int vertex;

public double value;

public Vertex(int vertex, double value){

this.vertex = vertex;

this.value = value;

}

@Override

public boolean equals(Object obj) {

Vertex a = (Vertex)obj;

return (a.value==value && a.vertex == vertex);

}

@Override

public int compareTo(Object o) {

Vertex temp = (Vertex)o;

int result = 1;

if(o.hashCode() == this.hashCode()){

result = 0;

} else {

if(temp.value==value){

result = -1;

}else

result = (new Double(value)).compareTo(new Double(temp.value));

}

return result;

}

};

public static void setIntelectIns(ImageView view, Polygon polygon){

PixelReader reader = view.getImage().getPixelReader();

int w = (int)view.getImage().getWidth(), h = (int)view.getImage().getHeight();

WritableImage imToCopy = new WritableImage(w, h);

WritableImage imToPast = new WritableImage(w, h);

PixelWriter writerToPast = imToPast.getPixelWriter();

PixelWriter writerToCopy = imToCopy.getPixelWriter();

for(int i = 0; i < w; i++){

for(int j = 0; j < h; j++){

if(polygon.contains(i+dx, j+dy)){

writerToCopy.setColor(i, j,reader.getColor(i, j));

writerToPast.setColor(i,j,Color.WHITE);

}else {

writerToPast.setColor(i, j,reader.getColor(i, j));

writerToCopy.setColor(i, j, Color.rgb(0,0,0,0));

}

}

}

view.setImage(imToPast);

Clipboard clipboard = Clipboard.getSystemClipboard();

ClipboardContent content = new ClipboardContent();

content.putImage(imToCopy);

clipboard.setContent(content);

}

private static ArrayList<ArrayList<Vertex>> setOfVertex;

private static double[] weightOnVertex;

private static TreeMultiset<Vertex> usedVertex;

private final static int INF = 2000000000;

private static int toVertex(int i, int j, int cols, int rows){

int index = (i)*cols + (j);

return index;

}

private static void createGraph(Image im){

int w = (int)im.getWidth() + 1;

int h = (int)im.getHeight() + 1;

PixelReader reader = im.getPixelReader();

setOfVertex = new ArrayList<ArrayList<Vertex>> (w*h);

for(int i = 0; i < w*h; i++){

setOfVertex.add(new ArrayList<Vertex>());

}

double value; int indToVertex, indVertex;

for(int i = 1; i < (h-1); i++){

for(int j = 1; j < (w-1); j++){

indVertex = toVertex(i, j, w, h);

//top

if(i==1){

value = 1.0/(abs((int)(255*reader.getColor(j-1,i-1).getBrightness()) - (int)(255*reader.getColor(j,i-1).getBrightness()))+1);

indToVertex = toVertex(i-1, j, w, h);

setOfVertex.get(indVertex).add(new Vertex(indToVertex, value));

setOfVertex.get(indToVertex).add(new Vertex(indVertex, value));

}

//right

value = 1.0/(abs((int)(255 * reader.getColor(j, i - 1).getBrightness()) - (int)(255 * reader.getColor(j, i).getBrightness()))+1);

indToVertex = toVertex(i, j+1, w, h);

setOfVertex.get(indVertex).add(new Vertex(indToVertex, value));

setOfVertex.get(indToVertex).add(new Vertex(indVertex, value));

//left

if(j==1){

value = 1.0/(abs((int)(255*reader.getColor(j-1,i-1).getBrightness()) - (int)(255*reader.getColor(j-1,i).getBrightness()))+1);

indToVertex = toVertex(i, j-1, w, h);

setOfVertex.get(indVertex).add(new Vertex(indToVertex, value));

setOfVertex.get(indToVertex).add(new Vertex(indVertex, value));

}

//bottom

value = 1.0/(abs((int)(255*reader.getColor(j-1, i).getBrightness()) - (int)(255*reader.getColor(j, i).getBrightness()))+1);

indToVertex = toVertex(i+1, j, w, h);

setOfVertex.get(indVertex).add(new Vertex(indToVertex, value));

setOfVertex.get(indToVertex).add(new Vertex(indVertex, value));

}

}

}

private static ArrayList<Integer> getPathInGraph(int startX, int startY, int endX, int endY, int w, int h){

w++; h++;

int length = w*h;

int fromVertex = toVertex(startX, startY,w,h);

usedVertex = TreeMultiset.create();

weightOnVertex = new double[length];

boolean[] used = new boolean[length];

for(int i = 0; i < length; i++){

weightOnVertex[i] = INF;

used[i] = false;

}

usedVertex.add(new Vertex(fromVertex,0));

ArrayList<Integer> answer = new ArrayList<Integer>();

int startVertex = toVertex(startX, startY, w, h);

int endVertex = toVertex(endX, endY, w, h);

weightOnVertex[startVertex] = 0;

int[] p = new int[length];

while(usedVertex.size()>0) {

int v;

Vertex temp = usedVertex.elementSet().first();

v = temp.vertex;

usedVertex.elementSet().remove(temp);

used[v] = true;

if(weightOnVertex[v]==INF){

break;

}

for (int j = 0; j < setOfVertex.get(v).size(); ++j) {

int to = setOfVertex.get(v).get(j).vertex;

double len = setOfVertex.get(v).get(j).value;

if (weightOnVertex[v] + len < weightOnVertex[to]) {

weightOnVertex[to] = weightOnVertex[v] + len;

p[to] = v;

}

if(!used[to]){

usedVertex.add(new Vertex(to,weightOnVertex[to]));

used[to] = true;

}

}

}

usedVertex = null;

weightOnVertex = null;

for(int i = endVertex; i!=startVertex; i = p[i]){

answer.add(i);

}

return answer;

}

private static int sigmaParam;

public static void setSigmaParam(int s){

sigmaParam = s;

}

public static int setImageToMagic(ImageView v, Image im){

int step = 1;

int sigma = sigmaParam;

int brightPixel;

int w = (int)im.getWidth();

int h = (int)im.getHeight();

int typeClasster = 0;

int countBlock = 0;

int countIter = 0;

Index []arrayPoint = new Index[100];

int countPoint = 1;

arrayPoint[countPoint] = new Index(w/2, h/2, w, h);

Block [][] twoDArrayBlock = new Block[w][h];

PixelReader reader = im.getPixelReader();

readerForClaster = reader;

brightPixel = (int)(reader.getColor(startPointX, startPointY).getBrightness()*255);

WritableImage writableImage = new WritableImage(w, h);

PixelWriter writer = writableImage.getPixelWriter();

pixelWriterForClaster = writer;

ArrayList<Claster> clasters = new ArrayList<Claster>();

ArrayList<Block> blocks = new ArrayList<Block>();

clasters.add(new Claster(typeClasster, Color.BLACK, 128));

for(int i = 0; i < w; i+= step){

for(int j = 0; j < h; j += step){

blocks.add(new Block(typeClasster, new Index(i, j, w, h), new Index(i+step, j+step, w, h)));

twoDArrayBlock[i][j] = blocks.get(countBlock);

clasters.get(typeClasster).setColorRGB(blocks.get(countBlock).R, blocks.get(countBlock).G, blocks.get(countBlock).B);

countBlock++;

}

}

clasters.get(0).resetRgb();

clasters.add(new Claster(++typeClasster, Color.AZURE, 255));

bloksForMagic = twoDArrayBlock;

setMagicBlock(clasters.get(typeClasster), startPointX, startPointY, sigma, step, 0);

clasters.get(typeClasster).resetRgb();

WritableImage write = new WritableImage(w, h);

PixelWriter writer1 = write.getPixelWriter();

pixelWriterForClaster = writer1;

for(int j = 0; j < blocks.size(); j++){

if(blocks.get(j).getTYPECLASSTER()==0){

blocks.get(j).setColor(Color.rgb(blocks.get(j).R, blocks.get(j).G, blocks.get(j).B, 0));

}else

blocks.get(j).setColor(Color.rgb(blocks.get(j).R, blocks.get(j).G, blocks.get(j).B));

}

Clipboard clipboard = Clipboard.getSystemClipboard();

ClipboardContent content = new ClipboardContent();

content.putImage(write);

clipboard.setContent(content);

pixelWriterForClaster = writer;

for(int j = 0; j < blocks.size(); j++){

if(blocks.get(j).getTYPECLASSTER()==0){

blocks.get(j).setColor(Color.rgb(blocks.get(j).R, blocks.get(j).G, blocks.get(j).B));

}else

blocks.get(j).setColor(Color.WHITE);

}

setImage(v, writableImage);

bloksForMagic = null;

readerForClaster = null;

pixelWriterForClaster = null;

return brightPixel;

}

public static int setImageToSegmentFill(ImageView v, Image im){

int step = 1;

int sigma = 25;

int w = (int)im.getWidth();

int h = (int)im.getHeight();

int typeClasster = 0;

int countBlock = 0;

int countIter = 0;

Index []arrayPoint = new Index[100];

int countPoint = 1;

arrayPoint[countPoint] = new Index(w/2, h/2, w, h);

Block [][] twoDArrayBlock = new Block[w][h];

PixelReader reader = im.getPixelReader();

readerForClaster = reader;

WritableImage writableImage = new WritableImage(w, h);

PixelWriter writer = writableImage.getPixelWriter();

pixelWriterForClaster = writer;

ArrayList<Claster> clasters = new ArrayList<Claster>();

ArrayList<Block> blocks = new ArrayList<Block>();

clasters.add(new Claster(typeClasster, Color.BLACK, 128));

for(int i = 0; i < w; i+= step){

for(int j = 0; j < h; j += step){

twoDArrayBlock[i][j] = null;

}

}

for(int i = 0; i < w; i+= step){

for(int j = 0; j < h; j += step){

blocks.add(new Block(typeClasster, new Index(i, j, w, h), new Index(i+step, j+step, w, h)));

twoDArrayBlock[i][j] = blocks.get(countBlock);

clasters.get(typeClasster).setColorRGB(blocks.get(countBlock).R, blocks.get(countBlock).G, blocks.get(countBlock).B);

countBlock++;

}

}

clasters.get(0).resetRgb();

int maxx = 0;

for(int i = 0; i < w; i+= step){

for(int j = 0; j < h; j += step){

if(twoDArrayBlock[i][j].getTYPECLASSTER()==0){

clasters.add(new Claster(++typeClasster, Color.AZURE, 255));

bloksForMagic = twoDArrayBlock;

setMagicBlock(clasters.get(typeClasster), i, j, sigma, step, 0);

clasters.get(typeClasster).resetRgb();

}

}

}

for(int j = 0; j < blocks.size(); j++){

blocks.get(j).setColor(clasters.get(blocks.get(j).getTYPECLASSTER()).color);

}

setImage(v, writableImage);

readerForClaster = null;

bloksForMagic = null;

pixelWriterForClaster = null;

return maxx;

}

Размещено на Allbest.ru


Подобные документы

  • Общая информация о графическом формате. Описание формата Microsoft Windows Bitmap. Структура файла DDВ исходного формата ВМР. Преобразования графических файлов. Просмотр и редактирование растровых изображений. Создание многодокументного приложения.

    дипломная работа [1,5 M], добавлен 06.06.2010

  • Структурная диаграмма программного модуля. Разработка схемы программного модуля и пользовательского интерфейса. Реализация программного модуля: код программы; описание использованных операторов и функций. Вид пользовательской формы с заполненной матрицей.

    курсовая работа [215,3 K], добавлен 01.09.2010

  • Описание математических методов представления и обработки графических изображений. Описание разработанного программного дополнения. Описание функций и их атрибутов. Представление и обработка графических изображений. Результаты тестирования программы.

    курсовая работа [1,7 M], добавлен 27.01.2015

  • Создание программного модуля, выполненного на языке программирования VBA (Visual Basic for Applications) и позволяющего во введенном массиве символов удалить все повторные вхождения этих символов. Разработка пользовательского интерфейса. Код программы.

    курсовая работа [317,4 K], добавлен 11.10.2012

  • Анализ влияния сглаживающего шума на различные категории томографических изображений. Разработка программного обеспечения для снижения помех и увеличения четкости очертаний крупных объектов. Метод рисования прямоугольников, ограничивающих все контуры.

    практическая работа [1006,7 K], добавлен 28.09.2019

  • Обзор существующего программного обеспечения для автоматизации выделения границ на изображении. Разработка математической модели обработки изображений и выделения контуров в оттенках серого и программного обеспечения для алгоритмов обработки изображений.

    дипломная работа [1,7 M], добавлен 27.03.2013

  • Разработка структурной диаграммы программного модуля. Представление схемы для основных расчетов выбранного приложения для создания прямоугольной матрицы. Особенности создания пользовательского интерфейса. Тестирование и отладка спроектированного модуля.

    курсовая работа [648,4 K], добавлен 27.05.2015

  • Моделирование предметной области. Состав программного модуля. Разработка логической структуры единой базы данных банковской информационной системы "БИС". Создание экранных форм для ввода и корректировки информации. Разработка интерфейса пользователя.

    курсовая работа [1,8 M], добавлен 17.05.2016

  • Проектирование программного модуля: сбор исходных материалов; описание входных и выходных данных; выбор программного обеспечения. Описание типов данных и реализация интерфейса программы. Тестирование программного модуля и разработка справочной системы.

    курсовая работа [81,7 K], добавлен 18.08.2014

  • Определение иерархии системы управления и контроля, а также структуры АСКУЭ. Разработка программного модуля обработки данных счётчиков электроэнергии. Определение технико-экономической актуальности, необходимости и возможности модернизации системы.

    дипломная работа [1,0 M], добавлен 20.05.2017

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.