Все

Рефераты

Пороговая обработка в задачах сегментации изображений

Контрольная Работа По Теории Вероятности , Итоговая Контрольная Работа 4 Класс

ВВЕДЕНИЕ


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

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

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

Одним из методов обработки изображений, о котором пойдет речь ниже, является пороговая обработка. Этот метод занимает одно из центральных мест в прикладных задачах сегментации изображений. Под сегментацией изображений понимают разделение исходного изображения на составляющие его области или объекты [1]. Такой подход в обработке изображений на сегодняшний день нашел очень широкое применение.

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

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


1. СЕГМЕНТАЦИЯ КАК ОБРАБОТКА ИЗОБРАЖЕНИЯ


1.1 основные понятия о представлении изображения


Задача обработки изображения на входе получает некоторое изображение. На выходе может быть не только обработанное изображение, но и некоторая его характеристика. Изображения бывают различными: от бинарных, то есть тех, в которых присутствует лишь два цвета (как правило, черный и белый), до 32-х битных изображений. Остановимся на самых распространенных 24-х битных изображениях формата .bmp (от англ. bitmap). Этот формат предназначен для хранения растровых изображений, то есть изображений, представляющих собой сетку пикселей или же точек цветов. Помимо него есть, несомненно, множество других форматов, таких как .jpeg (.jpg), .png, .tiff и другие. Отличаются они, как правило, способом кодировки изображения. Например, формат .jpeg содержит сжатые данные, которые были получены по одноименному алгоритму JPEG, являющемуся алгоритмом сжатия с потерей качества. Чтобы рассматривать изображение без потери качества и с полной глубиной цвета был выбран формат .bmp.

Изображение является 24-х битным, так как содержит в своем цвете три основных составляющих: R (красный), G (зеленый) и B (синий). Каждый из цветов варьируется в пределах от 0 до 256, то есть в пределах: [0;]. Таким образом, всего цветов может быть , или же 16.777.216. Цветовое пространство RGB на сегодняшний день очень распространено. Подавляющее большинство дисплеев телефонов, плееров, GPS-навигаторов, цифровых фотоаппаратов и видеокамер отображают именно 16 миллионов цветов. На самом деле компьютеры обрабатывают не сами изображения, а только массивы дискретных чисел [3]. Изображение в таком представлении, вообще говоря, - это двумерный массив точек, то есть матрица, каждый элемент которой есть набор трех значений: R, G и B. Формально изображение можно записать как некоторую функцию.

,(1.1)


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


(1.2)


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

Часто для анализа яркости изображения строят его гистограмму. Гистограмма изображения - это гистограмма уровней яркости изображения. Она позволяет оценить количество и разнообразие оттенков изображения, а также его общий уровень яркости. Гистограмма - это функция, аргументом которой являются всевозможные уровни яркости одной из составляющих R,G или B (или же непосредственно яркость, вычисленная по формуле (1.1)), то есть область определения лежит в диапазоне [0;255], а значением является количество точек, которые принимают данный уровень яркости. Для работы с изображениями на компьютере с использованием языков программирования высокого уровня существует достаточно много средств. Самыми распространенными являются: Open GL (Open Graphics Library) - это открытая графическая библиотека, DirectX - набор функций, разработанных для решения задач, связанных с видеопрограммированием под Microsoft Windows, а также непосредственно Microsoft Visual Studio, которая также представляет множество встроенных средств для работы с графикой.

1.2 обработка изображений: сегментация


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

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

Методы сегментации изображений делятся на два класса:

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

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

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

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

Алгоритмы сегментации также делятся, как правило, на два класса:

)основанные на базовом свойстве яркости: разрывности;

)основанные на базовом свойстве яркости: однородности [5].

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


1.2.1Сегментация в цветовом пространстве RGB

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

Предположим, что на RGB изображении необходимо выделить объекты, цвет которых лежит в определенном диапазоне. Задача сегментации в таком случае состоит в том, чтобы классифицировать каждый пиксель изображения в соответствии с тем, попадает ли его цвет в заданный диапазон или нет. Для этого в цветовом пространстве вводится мера сходства, как правило, евклидово расстояние [1]. Евклидово расстояние между точками и определяется выражением


,(1.3)


где , , - RGB компоненты вектора , а ,, - вектора .

Идею применения такой обработки можно в общих чертах увидеть в разделе 2.6 пояснительной записки.

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


2. ПОРОГОВАЯ ОБРАБОТКА В ЗАДАЧАХ СЕГМЕНТАЦИИ ИЗОБРАЖЕНИЙ


2.1 Введение в пороговую обработку изображений


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

В этом случае изображение обрабатывается по пикселям и преобразование каждого пикселя входного изображения в выходное определяется из соотношения:


,(2.1)


где - параметр обработки, называемый порогом, и - уровни выходной яркости. Обработка по пикселям, положение которых на изображении не играет никакой роли, называется точечной [2]. Уровни и играют роль меток. По ним определяют, к какому типу отнести данную точку: к или к . Или говорят, что состоит из фоновых точек, а из точек интереса [6]. Как правило, уровни и соответствуют уровням белого и черного. Для простоты изложения далее, где это будет встречаться, будем называть классы (он же класс интереса) классом объекта, а класс классом фона.

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


, (2.2)


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

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

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


,(2.3)


где - изображение, а - некоторая характеристика точки изображения, например, средняя яркость в окрестности с центром в этой точке.

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

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

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

Перейдем теперь непосредственно к основным алгоритмам пороговой классификации.

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

2.2 Глобальная пороговая обработка


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

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

Примером может послужить Рисунок 2.1.


Рисунок 2.1 - Гистограмма яркости, допускающее разделение с помощью одиночного глобального порога


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

Порог можно выбирать эвристически, то есть на уровне визуального изучения гистограмм. Однако в данной работе был реализован алгоритм автоматического вычисления значения порога . Он состоит из следующих этапов, предложенных в [5]:

)выбирается некоторая начальная оценка значения порога ;

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

)вычисляются значения и средних яркостей пикселей по областям и соответственно;

)вычисляется новое значение порога в соответствии с формулой:


(2.4)


)повторяются шаги со 2-го по 4-й до тех пор, пока разница значений при соседних итерациях не окажется меньше значения наперед заданного параметра .

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

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

Недостаток данного алгоритма заключается в том, что редко гистограмма поддается простому разделению и в большинстве реальных изображений такой подход не дает хороших результатов. Недостатком гистограммных методов в целом является то, что нет никакой гарантии в том, что пиксели, относящиеся к одной и той же моде распределения яркостей, лежат на изображении рядом и образуют связные области. Гистограмма по своей структуре не содержит характеристики о пространственном расположении пикселей [3]. Она лишь содержит информацию о частоте встречающихся на изображении пикселей с различными уровнями яркости. Однако, несмотря на этот недостаток, гистограммные методы, включая и глобальную пороговую обработку, встречаются крайне часто, потому что являются очень быстрыми методами и зачастую их результатов вполне достаточно. Если же гистограмма не подвергается четкому разделению и существует много локальных минимумов, то в таком случае сегментация глобальной пороговой обработкой оказывается не слишком успешной. Об этом можно судить по рисункам 2.2 и 2.3.


Рисунок 2.2 - Изображение сварочного шва на листе железа


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

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


Рисунок 2.4 - Гистограмма изображения сварочного шва рисунка 2.2


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


2.2.1 Инвертирование изображения

Часто для улучшения метода пороговой сегментации изображения применяют инвертирование изображения. Зачастую, такая предобработка используется непосредственно в глобальной обработке. Причиной тому является тот факт, что инвертирование изображения не только инвертирует цвета, но и яркость и освещённость, что делает светлее тёмные области и темнее светлые, а это в лучшую сторону влияет на работу алгоритма глобальной пороговой обработки. Инвертирование осуществляется по следующей формуле:


,(2.5)


где - значение яркости пикселя с координатами , вычисленной по формуле 1.1, а - новое значение яркости этого пикселя.

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

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

2.3 Локальная пороговая обработка


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

Для решения данной проблемы изображение разбивается на некоторые подобласти, в каждой из которых используется свое значение порога. Естественно, в таком случае помимо проблемы выбора порога появляется новая проблема: как разбить исходное изображение и как на каждой области выбрать свой порог. Поскольку порог, применимый для каждого пикселя, оказывается зависящим как от характеристик подобласти изображения, которая содержит данный пиксель, так и от его пространственного нахождения, то такое пороговое преобразование является локальным. Итак, исходное изображение разбивается на области, как на рисунке 2.5.



Рисунок 2.5 - Общий вид разбиения изображения на областей


Затем все подобласти анализируются по следующим принципам:

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

)все области, через которые проходит граница класса H1 (и все пиксели которых содержат класс H1) задаются своей дисперсией ;

)во всех областях из пункта 2) сегментация проводится с порогом, вычисленным по алгоритму из пункта 2.2 данной пояснительной записки [1];

)все области из пункта 1) обрабатываются как одно составное изображение, сегментация которого осуществлялась тоже по алгоритму из пункта 2.2 [1].

Таким образом, на основании 1) и 2) можно сделать вывод, что решение в выборе принадлежности пикселя к какому-либо из классов зависит от пространственного нахождения этого пикселя.

За начальное приближение во всех случаях принималась полусумма максимального и минимального значения яркости изображения.

Выбор размерности разбиения изображения полностью определяется пользователем. Однако следует заметить, что не любое разбиение приведет к верной сегментации. Единственный подход для определения верного выбора количества областей - практический. Однако общие рекомендации все-таки есть. Во-первых, задавать слишком большие разбиения (например, 50х50) не имеет смысла, иначе алгоритм становится слишком чувствительным к локальным минимумам. Естественно, не имеет смысла и разбиение 1х1. Самыми оптимальными разбиениями являются разбиения от 2х2 до 10х10 в зависимости от размеров самого изображения: чем больше изображение, тем допустимо более сильное разбиение.

Выбор дисперсий и также основывается исключительно из практических соображений. Для полутоновых изображений дисперсии рекомендуется выбирать в пределах [0;50], а для изображений в цветовом пространстве RGB [25;100]. Однако бывают и исключения. Именно из-за этих трех параметров алгоритм и называется «ручным» алгоритмом. Для автоматической сегментации экспериментальным путем мною были установлены следующие параметры:

количество разбиений : 2;

=75;

=100.

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

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

Достоинством локальной пороговой обработки является то, что он хорошо подходит для зашумленных изображений, для изображений, имеющих низкое качество, для изображений, характеризующихся сложной структурой фона, для изображений, яркости фона которых в различных местах достаточно сильно различаются. И, в отличие от глобальной обработки, такие алгоритмы дают неплохие результаты. Об этом можно судить на рисунке 6, на котором изображен результат сегментации того же сварочного шва, представленного на рисунке 2.6.


Рисунок 2.6 - Результат локальной пороговой обработки


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


2.4 Метод дискриминантного критерия


Пусть , - гистограмма некоторого цифрового изображения. - диапазон яркостей. Как уже говорилось выше, одной из проблем выбора порога является тот факт, что в реальных ситуациях практически не существует гистограмм, поддающихся легкому разделению. Другой проблемой является еще то, что границы между односторонними участками на изображении бывают размыты, а вследствие этого уровень гистограммы в граничных точках отличается от среднего уровня. Иногда провалы между пиками классов и практически полностью исчезают [4]. Одним из методов для преодоления этих трудностей является метод дискриминантного критерия.

Пусть у нас есть некоторое изображение с двумя гипотетическими участками. Назовем их для простоты объектом и фоном [4]. Построим распределение этого изображения . Для определения оптимального порога строим дискриминантную функцию , где . Аргумент имеет смысл пробного порога. Оно пробегает все возможные гипотетические значения порога и в результате то значение , которое будет максимизировать функцию , и будет являться оптимальным пороговым значением . Теперь рассмотрим как построить эту дискриминантную функцию .

Пусть изначально есть некоторое гипотетическое значение порога , которое разбивает распределение на два класса и . Если точки имеют яркость равную , то их можно отнести как к классу , так и к классу , поскольку количество таких точек достаточно мало относительно общего количества точек изображения. Тогда вероятность того, что взятая точка изображения будет относиться к классу , вычисляется по формуле (2.6):


.(2.6)

А вероятность принадлежности пикселя к классу определяется формулой 2.7:


.(2.7)


Нетрудно заметить, что , а, значит, у нас нет точек, не принадлежащих ни , ни .

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


(2.8)

и

.(2.9)


Данные выражения нормированы в силу деления на вероятности и .

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

,(2.10)

.(2.11)


Формулу (2.11) можно преобразовать следующим образом:


,(2.12)

где ненормированное математическое ожидание для вычисляется как


,(2.13)


а математическое ожидание для всего кадра :


. (2.14)


Тогда, дисперсия для всего кадра определяется выражением:


.(2.15)


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


. (2.16)


Тогда, безразмерная дискриминантная функция строится по формуле (2.17):


.(2.17)


Оптимальный порог будет является решением экстремальной задачи вида:


.(2.18)


Знаменатель в соотношении (2.17) является дисперсией всего кадра, вычисляющейся в соответствии с (2.15), а, значит, непосредственно от значения порога , который разбивает изображение на и , не зависит. Поэтому, для того, чтобы решить экстремальную задачу (2.18) достаточно решить задачу вида:


.(2.19)


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

Действительно, оптимальный порог в таком случае определяется характером зависимости межклассовой дисперсии (2.16) от пробного порога [4]. Логично, что если устремить к 0, то вероятность в соответствии с (2.5) также устремится к 0. А это, в свою очередь, означает, что все изображение будет целиком относиться к классу . Таким образом, математическое ожидание класса будет стремиться к математическому ожиданию всего изображения (). Значит, по формуле (2.17) межклассовая дисперсия тоже станет равной нулю. Если же пробный порог устремить к предельному его значению 255, то мы получим абсолютно такой же результат. Действительно, ведь тогда , значит, все изображение принадлежит , а это в свою очередь означает, что , значит, .

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

Алгоритм вычисления порового значения методом дискриминантного критерия можно представить следующим образом:

)найти для всего изображения математическое ожидание по формуле (2.14) и дисперсию (2.15);

)для всех значений из промежутка вычислить вероятности и в соответствии с формулами (2.6) и (2.7) соответственно;

)вычислить для всех значений математические ожидания и по формулам (2.10) и (2.11-2.12);

)составить функцию по формуле (2.17);

)решить задачу (2.18) (или же задачу (2.19)). Ту точку, при которой достигается решение этой задачи принять в качестве оптимального порога.

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

Приведем пример. На рисунке 2.7 приведен пример аэрофотоснимка земной поверхности.


Рисунок 2.7 - Аэрофотоснимок земной поверхности


Гистограмма данного изображения2) схематично представлена на рисунке 2.8, а его дискриминантная функция на рисунке 2.9.


Рисунок 2.8 - Схематичная гистограмма изображения 2.7


Рисунок 2.9 - Схематичное изображение функции


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

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


Рисунок 2.10 - Результат сегментации изображения 3


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

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


2.5 Адаптивная пороговая обработка


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

Как уже рассматривалось выше в локальной пороговой обработке, существуют сильно зашумленные изображения, которые невозможно обработать как изображение в совокупности, поэтому его разбивают на подобласти. Однако в локальной пороговой обработке решение о принадлежности пикселя какому-либо из классов принималось на анализе данных о пространственном положении этого пикселя. Но было напрямую неважно, какие по соседству с ним пиксели находятся, и какой характеристикой они обладают.

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


Рисунок 2.11 - Направление обхода соседних пикселей


Пусть пиксель с центром в данной области имеет координаты . Тогда считается пикселем класса , если у него стоит метка 0, и пикселем , если у него стоит метка 1. То есть становится пикселем тогда, когда для , где выполняется условие (2.20):


,(2.20)


где и играет как раз роль порогового значения, а средняя локальная яркость, определяющаяся по формуле (2.21):


,(2.21)


где - яркость в точке с координатами .

Параметр теоретически может быть любым, однако, целесообразно его выбирать в пределах от 0 до 10, поэтому в программе была предоставлена возможность выбирать именно в таком диапазоне. Такой диапазон обусловлен, тем, что при сильном увеличении этого параметра, то есть области соседей, практически было замечено, что результат почти не отличается от установки параметра , а время работы алгоритма становится несоизмеримо больше. Более того, при работе с большими изображениями, если параметр задавать слишком большим, требуется очень много виртуальной памяти, и на слабых машинах программа будет «вылетать». Параметр обычно подбирают, однако есть общие рекомендации. Например, при анализе и распознавании документов этот параметр выбирают как среднюю толщину линий рисунков и символов2). При сегментации бактерий выбирают среднюю толщину «брюшка» бактерии и так далее. Часто параметр выбирают исходя из непосредственных практических экспериментов.

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

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


,(2.22)

и

.(2.23)


2)вычисляются максимальное и минимальное приращения яркости относительно центрального пикселя по формулам (2.24) и (2.25):


,(2.24)

.(2.25)


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


,(2.26)


где - некоторая константа.


4)если же <, то тогда в окне содержится больше локальных высоких яркостей. И в соответствии с этим порог вычисляется по формуле:


.(2.27)

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

В большинстве случаев параметры задают, как правило, так:


=1,


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


Рисунок 2.12 - Искусственное сильно зашумленное изображение


Гистограмма изображения представлена на рисунке 2.13. Очень сильная изрезанность говорит о сильном влиянии шумов и неоднородности фона на изображении.

Рисунок 2.13 - Гистограмма изображения


Рисунок 2.14 - Результат адаптивной обработки (=5, )


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

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

То есть при повышении параметра степень детализации уменьшается, а при уменьшении - увеличивается. Это следует из формул определения пороговой величины (2.26) и (2.27). Если задача поставлена в противоположном аспекте, то есть поиске светлых участков на более темных, то ситуация складывается обратная. Продемонстрируем это. Простым схематическим примером может служить изображение 2.15. На этом рисунке изображен негатив солнца, а на солнце солнечные пятна


Рисунок 2.15 - Солнце


Рисунок 2.16 -


Рисунок 2.17 -


Интерпретируя изображения 2.16 и 2.17, можно сказать, что результаты работы на обоих рисунках принципиально разные. Если под задачей подразумевается выделение звезды, как таковой, то результатом может быть рисунок 2.17 (в многомерном случае - много звезд), а если под задачей подразумевается определение пятен (выбросов) на солнце, то очевидно, что результатом будет рисунок 2.16. В этом случае степень детализации на рисунке 2.16, очевидно, больше, чем на рисунке 2.17. Параметр определялся в соответствии с его смысловой нагрузкой: если в первом случае нас интересовали пятна, то , так как объекты небольшие, а во втором - максимальному значению , так как нас интересует непосредственно солнце, то есть большой объект. На данном примере очень точно еще отображается тот факт, что понятие объекта и фона - относительное. Нельзя говорить, что все время белые области на изображении будут представлять для нас интерес. Как мы видим, в одном случае белые пиксели образуют класс интереса, а в другом - черные. Все зависит от конкретной интерпретации и только.


2.6 Применение пороговой обработки


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

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

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

Пороговая обработка может применяться на производстве. Например, на рисунке 3.51 представлено изображение сварочного шва цветных металлов. После сегментации изображения, очевидно, пользователь получит координаты выделенного объекта. Эту информацию можно применить на производстве, например, для автоматического шлифования швов. Автоматическая система управления на вход после работы алгоритма пороговой обработки получает некоторые координаты интересующего класса на изображении, эти данные она передает рабочим-роботам, которые в точных полученных координатах начинают выполнять работу по шлифованию, чтобы убрать видимость шва сварки. Как предобработку такого рода изображений, пороговую сегментацию можно применить для установления длины и толщины сварочных швов, как это сделано в [8].

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

Системы, основанные на биометрических данных человека, например, сканирование отпечатков пальцев также активно применяются на сегодняшний день в системах защиты доступа на ноутбуках, персональных компьютерах и даже смартфонах. На изображении 3.67 представлен отпечаток пальца человека. Результатом сегментации является бинарное изображение, дающее полное представление о характеристике отпечатка. Таким образом, используя это изображение и сравнивая его с определенной базой данных можно устанавливать личность человека, отпечаток которого обрабатывался. Применение самое разнообразное: от поиска людей по базе данных до разблокировки системы безопасности [1, с. 857-858]. На рисунках 3.68-3.71 показаны результаты сегментации. Самый точный результат, насколько это можно судить по изображению, дает адаптивная обработка. Все геометрические линии четкие, без потерь, лишних линий не появляется.

Применение может быть и совершенно в другой области, такой как распознавание нефтяных пятен [9]. Например, на рисунке 3.62 представлен след от крушения огромного нефтяного танкера, несущего на своем борту десятки тысяч тонн нефти. Наибольшую ценность сегментации таких радиолокационных изображений представляют, очевидно, координаты этого нефтяного следа. На сегодняшний день задачу очистки морей от нефтяных пятен в основном выполняют с помощью непосредственного участия человека. Однако уже сегодня ведутся активные разработки машин, способных самостоятельно производить очистку [10]. Такие роботы в необходимом количестве выпускаются на поверхность воды, где они способны очистить нефтяные пятна от самых вредных соединений, наиболее сильно разрушающих экологию. Работать роботы, вполне вероятно, будут на координатах GPS-навигации. Тогда, применение сегментации путем пороговой обработки может быть следующим: анализируется исходное радиолокационное изображение нефтяного пятна, запускается программа по вычислению пороговой величины, проводится пороговая классификация, затем проводится некоторая обработка изображения, например по геометрическим характеристикам, чтобы исключить лишние детали на изображении, формируется массив «перспективных» точек, координаты которых известны (в пикселях изображения). Так как изображение со спутника, то координаты сфотографированной поверхности известны в градусах и минутах, отсюда не составляет никакого труда получить информацию о том, сколько один пиксель занимает градусов и минут. Далее, путем обратного восстановления можно получить GPS-координаты этого массива точек, характеризующего пятно. Эти координаты можно уже далее передать в GPS-навигаторы роботов, которые по заданным координатам выполнят очистку. Такие технологии сейчас разрабатываются, и, возможно, в скором времени будут применяться на практике.

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

Самым простым и чисто схематическим примером могут послужить рисунки 2.15-2.17. Предположим, что точно известно, что не существует никаких самостоятельных разрезов, помимо искомого, любая точка которого отстоит от любой точки искомого разреза ближе, чем на расстояние, равное 50 пикселям (размерность в пикселях условна, ее можно перевести, например, в миллиметры). Кроме того, предположим, что известна еще информация о том, что «не разрезов» не может быть больше 10% от изображения. Все, что больше 10% является «нужным» разрезом. То есть существует какой-либо небольшой «отстоящий» от крупного разреза объект, которого быть не должно по каким-то причинам.


Рисунок 2.15 - Результат обработки (допустим, появился лишний объект)


Рисунок 2.16 - Желтым кругом отмечен возможный разрез, зеленым - невозможный


Рисунок 2.17 - Результат выделения невозможного объекта (красным)


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

На рисунке 3.57, представляющим другое применение пороговой обработки, изображен аэрографический снимок земной поверхности. В данном случае пороговая обработка используется как предобработка изображений, поэтому в данном случае нам важно именно получившееся изображение. Путем других обработок, основанных уже на геометрических параметрах (например, площадь), можно уже выделять различного рода объекты: заводы, фермы и так далее. Все зависит от критерия, по которому мы хотим, чтобы автоматическая система выделила объект, а бинарного изображения, как правило, для таких задач вполне хватает [11].

Интересной сферой применения общей идеи пороговой обработки является использование ее, как один из этапов решения задачи по обнаружению лиц на изображении. В задаче локализации области лица пороговая обработка служит для того, чтобы определить те пиксели объекта, которые соответствуют цвету кожи [12]. Затем осуществляется поиск овала лица. Пороговые диапазоны не нужно вычислять, в соответствии с [12] они были вычислены практически, на основании базы данных фотографий, и для кожи лица белого человека они составляют:



Мною были проверены данные утверждения, результат можно посмотреть на изображении 2.16.


Рисунок 2.15 - Исходное изображение лица человека


Рисунок 2.16 - Результат обработки


Как видно на рисунке 2.16 область кожи определена корректно, затем такое изображение подается на вход программе, выполняющей корреляционно-экстремальный анализ, при котором осуществляется плоскопараллельное смещение маски по обрабатываемому изображению и подсчет количества пикселей. Взаимное положение маски и части изображения, для которого количество таких пикселей максимально, принимается соответствующим реальному расположению лица [13]. Таким образом, общая идея пороговой обработки нашла свое применение и здесь, но в общем случае, так как пороговые значения для цвета кожи уже известны и тогда такая обработка не представляет абсолютно никакой сложности.

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


3. ИССЛЕДОВАНИЯ


3.1 Исследования на искусственных изображениях


Рассмотрим работу алгоритмов на искусственно созданных изображениях. Методика создания и анализа качества работы алгоритмов:

1)создается «эталон» изображения, то есть совершенно черный объект на совершенно белом фоне4);

2)изображение искусственно подвергается искажению. Под искажением понимают какую-либо совокупность вариантов:

а)однородный белый фон становится неоднородным;

б)появление шумов на изображении;

в)использование различных фильтров.

)выполняется сегментация определенным методом;

4)выполняется подсчет площади (в пикселях) эталона изображения и результата;

)производится сравнение величин и вычисление потерь алгоритма в %.

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

ГПО - глобальная пороговая обработка;

АПО - адаптивная пороговая обработка;

МДК - обработка методом дискриминантного критерия;

ЛПО - локальная пороговая обработка.

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

-адаптивная пороговая обработка: (, );

локальная пороговая обработка: (, , ).

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

Исследование 1:

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


= 13415


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


Рисунок 3.2 - ГПО


Рисунок 3.3 - АПО


Рисунок 3.4 - МДК


Рисунок 3.5 - ЛПО (3, 0, 25)



Таблица 1 - Результаты исследования 1

Площадь (в пикселях)Потери (в %)ГПО1341500АПО13425100.08МДК1341720.02ЛПО1341500

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


Исследование 2:

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

= 18748


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


Рисунок 3.7 - ГПО


Рисунок 3.8 - АПО (2, 0.92)


Рисунок 3.9 - МДК


Рисунок 3.10 - ЛПО (2, 0, 15)


Таблица 2 - Результаты исследования 2

Площадь

(в пикселях)Потери (в %)ГПО188851370.73АПО18813650.35МДК18835870.47ЛПО188651170.63

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


Исследование 3:

Цель: установить качество работы алгоритмов на объектах, имеющих элемент, толщиной в 1 пиксель. Фон неоднородный, тем самым попытаемся «сбить» алгоритм от определения тонкого элемента объекта.

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


= 11867


Рисунок 3.12 - ГПО


Рисунок 3.13 - АПО


Рисунок 3.15 - ЛПО

Таблица 3 - Результаты исследования 3

Площадь

(в пикселях)Потери (в %)ГПО115213462.92АПО1186700МДК115233442.90ЛПО115972702.27

Вывод: лучше всех с алгоритмом справляется адаптивный метод. Как и утверждается теорией, параметр лучше выбирать равным примерно той толщине объекта, который хотим выделить. Поэтому =1 по умолчанию и привел к самой лучшей 100% сегментации. Параметр не менялся (0.66), однако, если его повысить, то можно ожидать, что часть точек в рассмотрение не попадут (учитывая формулы (2.25) и (2.26)), а значит, могут быть потери. Хуже всего ведет себя локальный метод. Несмотря на то, что он «ближе» к эталону, он не только не выделил тонкий объект, но еще и «отреагировал» на шумы, что неприемлемо. Повысим значение параметра и продемонстрируем пример обработки.


Рисунок 3.16 - АПО ()


Исследование 4:

Цель:проверить, как распознают алгоритмы цветные объекты различной яркости. Изображение цветное.

= 18018, то есть все три объекта.


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


Рисунок 3.18 - ГПО


Рисунок 3.19 - АПО


Рисунок 3.20 - МДК


Рисунок 3.21 - ЛПО


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

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


Исследование 5:

Цель:определение влияния черного цвета на изображении на работу алгоритмов.


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


Результатом являются пустые изображения, то есть эти алгоритмы глобальной и дискриминантной обработки не нашли ни одного объекта. Результаты работы адаптивного и локального методов по-прежнему полностью 100% и совпадают с результатами на изображениях 3.19 и 3.21.

Вывод: исследуемые два алгоритма не справляются с поставленной задачей.

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


Исследование 6:

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

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


Рисунок 3.24 - ГПО


Рисунок 3.25 - МДК


Вывод: как видно из рисунка 3.24 глобальный алгоритм определил лишь те пиксели объекта, которые перекрывает шум. Потому что в этих частях шум является более темным, чем цвета объектов. Из рисунка 3.25 видно, что алгоритм, построенный на использовании дискриминантной функции, очень хорошо определил объекты. Причиной резкого улучшения работы алгоритма стало то, что теперь на изображении не 3 цвета, а гораздо больше. О чем свидетельствует гистограмма, приведенная на рисунке 3.26


Рисунок 3.26 - Гистограмма рисунка 3.22


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


Исследование 7:

Цель:посмотреть результаты работы алгоритмов на объектах, наложенных друг на друга и имеющих различные вариации яркости. Проанализируем рисунок (3.27).


Рисунок 3.27 - Вложенные круги


На данном рисунке расположено 4 вложенных друг в друга круга. Все они имеют различную яркость. Необходимо определить, что выдаст каждый из алгоритмов в качестве фона, а что в качестве объекта. Как уже говорилось выше, вообще говоря, выбор объекта - задача неоднозначная. Кто-то скажет, что на этом изображении всего один объект, серый круг. И неважно что он содержит еще 3 других круга. Кто-то скажет, что объект только белый круг. А объектом на самом деле может быть и красный и белый круги. Поэтому решено было провести исследование, что же будет являться объектом для алгоритмов. Глобальная обработка и обработка методом дискриминантного критерия все отнесли к одному классу , что очевидно нас не устраивает.

Посмотрим на работу других алгоритмов


Рисунок 3.28 - АПО


Рисунок 3.29 - ЛПО


Вывод: адаптивная пороговая обработка «не увидела» розовый круг внутри серого, а локальная «увидела». ЛПО выдала объектами в данной ситуации розовый и белый круг. Однако, такое утверждение носит относительный характер. На самом деле, здесь присутствует всего 2 класса: H0 и H1. Так вот серый и синие круги относятся к классу H1. Белый и розовый - к H0. И сказать в данном случае какой из классов является объектом, а какой фоном - решение сугубо субъективное. Можно сказать, что локальный алгоритм пороговой обработки гораздо чувствительнее к всему спектру находящихся на изображении вариаций яркостей, чем глобальная и пороговые обработки. Адаптивный алгоритм чувствителен больше к сильной разнице по яркости между объектами, чем к числу нахождения различных уровней яркости на изображении. Чувствителен он также и к темным объектам.


Исследование 8:

Цель:определить, насколько «усредняет» каждый алгоритм объект, подвергшийся сильному смазыванию.


= 8636


Рисунок 3.30 - Эталон


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


Рисунок 3.32 - ГПО

Рисунок 3.33 - АПО


Рисунок 3.34 - МДК


Рисунок 3.35 - ЛПО


Таблица 4 - Результаты исследования 8

Площадь

(в пикселях)Потери (в %)ГПО862880.1АПО8715790.91МДК11252261623.24ЛПО92946587.07

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

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


Исследование 9:

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

На рисунке 3.36 представлено сфотографированное изображение. Слово RGB резко выделяется из фона и, очевидно, является объектом интереса. Однако изображение было нарисовано простым карандашом так, что, по сути, искусственно созданные шумы имеют практически ту же яркость, что и слово RGB, поскольку и те и те нарисованы одним и тем же графитом, а слово RGB лишь немного было усилено интенсивностью. Очевидно, что при разбиении изображения на части (как в адаптивной и локальной обработках) алгоритмы могут начать сбиваться, несмотря на то, что гистограмма изображения (рисунок 3.36) поддается весьма явному разделению на два класса.


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


Рисунок 3.37 - Гистограмма изображения


Рисунок 3.38 - ГПО


Рисунок 3.39 - АПО


Рисунок 3.40 - МДК


Рисунок 3.41 - ЛПО


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

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


3.2 Исследования на предметных изображениях


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

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


Исследование 10:

Цель:сравнить работоспособность алгоритмов на реально существующих задачах. Задача определения микроорганизма на изображении. Изображение плохого качества, фон непростой структуры, вокруг «Хромосомы» также имеется свечение, которое будет неблагоприятно реагировать на работу алгоритмов.

Эталон был получен путем ручной «попиксельной» обводки объекта черным маркером и его закрашиванием.

= 11473,

= 52787,

= 64260.


Рисунок 3.42 - Эталон

Рисунок 3.43- Изображение «Хромосома»


Рисунок 3.44 - ГПОРисунок 3.45 - АПО


Рисунок 3.46 - МДКРисунок 3.47 - ЛПО


Таблица 5 - Результаты исследования 10

Площадь

(в пикселях)Потери (в %)ГПО13497202414.26%АПО123869137.38%МДК124519787.06%ЛПО122417686.43%

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

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


Исследование 11:

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

Рисунок 3.48 - Инвертированное изображение


Рисунок 3.49 - ГПОРисунок 3.50 - АПО


Рисунок 3.51 - МДК


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

Таблица 6 - Результаты исследования 11

Площадь

(в пикселях)Потери (в %)ГПО1264111689.24АПО16258478529.44МДК14878340522.89

Вывод: из результатов работы алгоритма на инвертированном изображении видно, что глобальная пороговая обработка улучшает качество сегментирования на 5.02%, что весьма существенно. Однако, остальные алгоритмы показывают себя хуже. Но так как глобальная обработка самая простая и быстрая, то зачастую путем инвертирования можно добиться схожих с другими методами результатов, а вычислительных затрат при этом получается в разы меньше.


Исследование 12:

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

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


Рисунок 3.52 - Шов сварки цветных металлов


Рисунок 3.53 - Гистограмма изображения 3.35


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


Рисунок 3.54 - ГПО


Рисунок 3.55 - АПО (3, 0.30)


Рисунок 3.56 - МДК


Рисунок 3.57 - ЛПО


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


Вывод: по рисункам 3.54-3.57 можно сделать вывод, что глобальная обработка, как и ожидалось, не дает совершенно никаких результатов. Дискриминантная обработка тоже не показывает даже удовлетворительной сегментации. А вот адаптивная и локальные обработки дают весьма неплохие результаты на таком сложном изображении. Зрительно, они примерно одинаково выделили шов. Адаптивную обработку можно «упрекнуть» лишь за появившиеся в правой крайней части помехи.


Исследование 13:

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


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


Рисунок 3.59 - ГПОРисунок 3.60 - АПО

Рисунок 3.61 - МДКРисунок 3.62 - ЛПО


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


Исследование 14:

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

На рисунке 3.63 представлено космическое радиолокационное изображение акватории Северной Атлантики вблизи побережья Испании. Темным шлейфом на снимке тянется пятно от того места, где тонет танкер Престиж. Танкер ушел под воду 19 ноября, унеся с собой на дно более чем 50 тысяч тонн топлива.


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

Рисунок 3.64 - ГПО


Рисунок 3.65 - АПО


Рисунок 3.66 - МДК


Рисунок 3.67 - ЛПО


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


Исследование 15:

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

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


Рисунок 3.69 - ГПОРисунок 3.70 - АПО


Рисунок 3.71 - МДКРисунок 3.72 - ЛПО


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

Исследование 16:

Пороговая обработка применяется в робототехнике в самых разнообразных областях. Она также применяется для автоматического распознавания разрывов (или пробоев) на листах металла. На рисунке 3.73 показан пример такого разрыва на металлическом листе.


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


Рисунок 3.74 - ГПОРисунок 3.75- АПО


Рисунок 3.76 - МДКРисунок 3.77 - ЛПО


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

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

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

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

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


4. РАЗРАБОТАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ


4.1 Общие сведения


Разработанная программа называется «Программа пороговой обработки изображений». Данное программное обеспечение (далее ПО) написано на языке высокого уровня C++, с использованием Microsoft Visual Studio 2008. Программа написана с использованием набора компонент стандарта .NET Framework версии 2.0. Для работы программы необходима операционная система Windows XP Sp3 и установленная платформа не ниже версии .NET Framework 2.0.

Windows Forms - это совершенно новый стиль построения приложения на базе классов .NET Framework. Основное отличие Windows Forms от уже разработанных ранее моделей построения приложений, таких как Win 32 API и MFC, заключается в том, что Windows Forms создает более однородную структуру программной модели. Также преимущество в том, что с использованием Windows Forms легко можно программировать на разных языках (C++, C# и так далее).

Консольная версия программы написана с использованием Open GL 1.1, поэтому для использования консольной версии необходима видеокарта с поддержкой OpenGL не ниже версии 1.1.


4.2 Входные данные


На входе подается 24-х-битное изображение формата .bmp любого разрешения. Также для работы программы следует выбрать файл результата в формате .txt. Для выбора этих файлов программа контактирует с пользователем посредством диалогового режима5). Диалоговый режим работы с пользователем для выбора файлов представлен на рисунке А.1

4.3 Выходные данные


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

1)координаты пикселей выделенного класса H1 (класс «интереса»);

2)значения составляющих исходного изображения в этих пикселях;

)значение яркостей всех пикселей объекта;

)общее количество пикселей класса H0, класса H1 и всего изображения.


4.4 Описание структуры ПО


Для создания данного ПО было написано две отдельных программы, которые были впоследствии связаны друг с другом. Первая программа была написана в консольном приложении и включала в себя все описанные алгоритмы, а также все необходимые данные и параметры. Вторая программа была написана с использованием средств Windows Forms для создания визуального интерфейса. Для работы с изображениями были использованы встроенные средства Visual Studio. Поэтому, в итоговой программе Open GL не используется, он используется только в отдельной версии консольной программы.

При использовании Windows Forms создается главное окно. Главное окно приложения является формой. Любые другие окна приложения - тоже формы. Приложения осуществляют полный контроль над событиями в собственных окнах. Все события, коих великое множество, такие как нажатие кнопки, флажка, наведение мышью на какой-либо объект и так далее, обрабатываются путем наложения событий на эти действия. При создании какого-либо действия над каким-либо объектом появляется новая функция, обрабатывающая эти события, и она добавляется в общий класс формы, в которой находится данный объект.

На изображении А.3 Приложения А показан общий вид главной формы. В левой верхней части находится область работы с файлами: исходным файлом изображения и текстовым файлом результата.

Если какой-либо файл не был выбран, возникает ошибка. Пример изображен на рисунке А.6.

В левой нижней части предоставлена работа непосредственно с данными алгоритмов и управляющими элементами по запуску сегментации. По нажатию на кнопку «Запуск!» выполняется работа алгоритма с заданными параметрами.

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

В правой части также представлена область работы с гистограммами. Четыре кнопки отвечают за построение гистограмм компонент . Все гистограммы строятся в новом окне. Параметр масштаба гистограмм является регулируемым. Чем больше масштаб, тем гистограмма становится мельче. Масштаб изменяется в пределах от 1 до 100. Общий вид гистограмм был представлен на протяжении всей работы.

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

Подробнее о программной реализации можно узнать в Приложении Б.


ЗАКЛЮЧЕНИЕ


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

Основными результатами данной работы являются:

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

·изучены и реализованы следующие методы пороговой обработки:

oглобальная пороговая обработка;

oлокальная пороговая обработка;

oпороговая обработка методом дискриминантного критерия;

oадаптивная пороговая обработка.

·проведены сравнительные исследования работы алгоритмов;

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

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

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

СПИСОК ЛИТЕРАТУРЫ


1.Вудс, Р. Цифровая обработка изображений / Р. Вудс, Р. Гонсалес. - Москва : ТЕХНОСФЕРА, 2005. - 1072 с.

2.Визильтер, Ю.В. Обработка и анализ цифровых изображений с примерами на LabVIEW и IMAQ VIsion / Ю.В. Визильтер [и др.]. - Москва : ДМК, 2077. - 464 с.

.Яне, Б. Цифровая обработка изображений / Б. Яне. - Москва : ТЕХНОСФЕРА, 2007. - 584 с.

.Грузман, И.С Цифровая обработка изображений в информационных системах / И.С Грузман [и др.]. - Новосибирск : НГТУ, 2002. - 352 с.

.Вудс, Р. Цифровая обработка изображений в среде MATLAB / Р. Вудс, Р. Гонсалес, С. Эддинс. - Москва : ТЕХНОСФЕРА, 2006. - 616 с.

.Вежневец В. Выделение связных областей в цветных и полутоновых изображениях [Электронный ресурс] / И.М. Журавель. - Режим доступа: #"justify">7.И.М. Журавель "Краткий курс теории обработки изображений" [Электронный ресурс]. - Режим доступа: #"justify">ПРИЛОЖЕНИЕ А


ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ


Рисунок А.1 - Диалоговый режим выбора файла


Рисунок А.2 -Результат сегментации


Рисунок А.3 - Главная форма программы

Рисунок А.4 - Общий вид подсказки


Рисунок А.5 - «Помощь»


Рисунок А.6 - Ошибка

ПРИЛОЖЕНИЕ Б


ПРОГРАММНАЯ РЕАЛИЗАЦИЯ


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

Основная часть программы написана с использованием Open GL. Класс RGBPixmap был взят и немного переработан из [13] с использованием приемов из [14].

Основная часть программы:


PROG.CPP

//---------------основные библиотеки для работы с программой-----//

#include <windows.h>

#include <stdio.h>

#include <conio.h>

#include <math.h>

#include <assert.h>

#include <GL/gl.h>//библиотека для работы с Open GL

#include <GL/glu.h>//библиотека для работы с Open GL

#include <GL/glaux.h>//библиотека для работы с Open GL

#include "glut.h"

#include <fstream>

#include <iostream>

namespace std; globa//вся программа заключена в область globa

{

//---------------------------------------------------------------------------//

//---------------------------------------------------------------------------//

//------------------- параметры обработки изображения------------------//

//---------------------------------------------------------------------------//

//---------------------------------------------------------------------------//

a_kol_razb;//количество областей при разбиении изображенияloc2al_tochka_razbienija;//переменная, отвечающая за определения порога разбиения области на принадлежащую фону или объекту (локальная обработка)loc2al_dispers_fone;//перменная, отвечающая за добавление яркости к пикселям фона (локальная обработка)loc2al_dispers_object;//перменная, отвечающая за добавление яркости к пикселям объекта (локальная оработка)

alfa=2./3.;//порог, для адаптивной локальной обработкиKK=1;//праметр, определяющий область соседей (адаптивная обработка)*filename;//имя файла с изображением*rez;//результирующий файл с данными об изображении


//---------------------------------------------------------------------------//

//-----------------конец параметры обработки изображения------//

//---------------------------------------------------------------------------//

//---------------------------------------------------------------------------//

screenWidth=1024, screenHeight=768;//размеры рисуемого изначально окна


//**************переопределение типов *************************************//unsigned short ushort;unsigned long ulong;unsigned char uchar;


int histogramma[256][4];//область памяти для хранения 4х гистограммwhat_draw=0, one_raz=0;//что будем рисовать и флаг на копирование исходного изображенияadpt_porog[3];//порог, для локальной обработки

FILE *f1;

inf;i_flag=0, loc2al_i_flag=0;j_flag=0, loc2al_j_flag=0;

whichPic=0,otstyp=10;

delRGB=40, delR=40;//для наглядной визуализации гистограмм


int *a_peresek;//массив для определения областей,содержащих и фон и объект.

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

ushort getShort()

{ic;ip;.get(ic);=ic;.get(ic);|=((ushort)ic << 8);ip;

}

getLong()

{ip=0;ic=0;char uc=ic;

.get(ic);=ic;=uc;.get(ic);=ic;

|=((ulong)uc << 8);.get(ic);=ic;

|=((ulong)uc << 16);.get(ic);=ic;

|=((ulong)uc << 24);


return ip;

}


//******************класс RGB для каждого пикселя ************************//

class mRGB{: uchar r,g,b;

mRGB()//конструкторы

{=0;=0;=0;

}(mRGB& p)

{=p.r;=p.g;=p.b;

}(uchar rr, uchar gg, uchar bb)

{=rr;=gg;=bb;

}set(uchar rr, uchar gg, uchar bb)

{=rr;=gg;=bb;

}


};

mmRGB{: double r,g,b;()

{=0;=0;=0;

}(mmRGB& p)

{=p.r;=p.g;=p.b;

}


};


* pixel;//массив пикселов основного рисунка

mRGB* px1;//массив пикселов, принадлежащих фону* px2;//массив пикселов, принадлежащих объекту* pixel2;//массив пикселов (вспомогательный)


//******************класс пиксельной карты******************************//RGBpixmap{


public:nRows, nCols;

()

{=nCols=0;=0;

}(int r, int c)

{= r;= c;= new mRGB[r*c];


}setPixel(int x, int y, mRGB color)//процедура установки пикселя

{(x>=0 && x<nCols && y>=0 && y<nRows)[nCols*y+x]=color;

}

getPixel(int x, int y)//процедура получения пикселя

{pixel[nCols*y+x];

}

draw()//процедура рисования массива пикселей

{(nRows ==0 || nCols==0) return;(GL_UNPACK_ALIGNMENT,1);(nCols, nRows, GL_RGB, GL_UNSIGNED_BYTE,pixel);

}

freeIt()//освобождение памяти

{[]pixel;=0;=0;

}

copy(int x, int y, int wid, int ht)//копирование пикселя

{(x,y,wid,ht,GL_COLOR);

}

readBMPFile(char * fname)//функция чтения BMP файла

{

.open(fname, ios::in | ios::binary);

(!inf)

{<< "can't open file: " << fname << endl;0;

}k, row, col, numPadBytes, nBytesInRow;ch1, ch2;.get(ch1);

inf.get(ch2);


//получение всей необходимой о файле информации

ulong fileSize = getLong();reserved1 = getShort();reserved2 = getShort();

offBits = getLong();

headerSize = getLong();

numCols = getLong();numRows = getLong();

planes = getShort();

bitsPerPixel = getShort();compression = getLong();

xPels = getLong();yPels = getLong();

numLUTentries = getLong();impColors = getLong();(bitsPerPixel != 24)//если изображение не 24 бита, то ошибка

{<< "not a 24-bit pixel image\n";.close();0;

}

= ((3*numCols+3)/4)*4;= nBytesInRow-3*numCols;= numRows;= numCols;

= new mRGB[nRows * nCols];//выделение памяти= new mRGB[nRows* nCols];= new mRGB[nRows* nCols];


//adapt = new mRGB[adaptRows*adaptCols][3];

(!pixel) return 0;count = 0;

char dum;

//запись в основной массив пикселей (pixel) считанных пикселей изображения

for (row=0; row<nRows;row++)

{(col=0; col<nCols; col++)

{r,g,b;.get(r);.get(b);.get(g);

[count].r=r;[count].g=g;[count].b=b;++;

}(k=0;k<numPadBytes;k++)>> dum;

}.close();1;

}

copy_image(mRGB *copy_pixel, mRGB *isxod_pixel)

{all;=nRows*nCols;

(int i=0;i<all;i++)

{_pixel[i].r = isxod_pixel[i].r;_pixel[i].g = isxod_pixel[i].g;_pixel[i].b = isxod_pixel[i].b;

}


}

//*************функция определения принадлежности пикселя фону или объекту *************************//

int func_glob_porog(int num, double sr[3])

{min_porog=0, max_porog,rez=0;_porog=110;(pixel[num].r<=sr[0] && pixel[num].g<=sr[1] && pixel[num].b<=sr[2]) rez=1;

else rez=0;rez;

}


//******************процедура для фонового пикселя ***********************//

void pixel_in_fone(int num)

{[i_flag].r=pixel[num].r;[i_flag].g=pixel[num].g;[i_flag].b=pixel[num].b;


i_flag++;

}


//*****************процедура для пикселя объекта ************************//

void pixel_in_object(int num)

{[j_flag].r=pixel[num].r;[j_flag].g=pixel[num].g;[j_flag].b=pixel[num].b;

j_flag++;

}

//*********************функция средней яркости (по RGB) *********************//

int sred_rgb(int razm, int flg, int what)

{a=0,b=0,c=0;(what==0)

{(int i=0;i<razm;i++)

{+=px1[i].r;+=px1[i].g;+=px1[i].b;

}

}

{(int i=0;i<razm;i++)

{+=px2[i].r;+=px2[i].g;+=px2[i].b;

}

}=a/razm;=b/razm;=c/razm;(flg==0) return a;(flg==1) return b;(flg==2) return c;

}

};

RGBpixmap pic[1]; //элемент класса пиксельной карты, содержащий изображение


//----------------------------------------------------------------//

//**************процедура глобального порога******************//

//----------------------------------------------------------------//glob_porog()

{ct=0;flag=0,pf=0,po=0,cvet_fon,cvet_object,fon_or_object=1;ch1='r',ch2='g',ch3='b';T0=1.0,argb[3],zrgb[3],Trgb[3],TTrgb[3],mxrgb=0.0,mnrgb=0.0;max_rgb[3],min_rgb[3],skok;

_fon=0;//цвет фона

cvet_object=255; //цвет объекта

skok=pic[whichPic].nCols*pic[whichPic].nRows;//количество пикселей


for(int i=0;i<3;i++)//зануление массивов

{[i]=0;_rgb[i]=0;_rgb[i]=0;

}

(int i=0;i<skok;i++)

{( max_rgb[0] < pixel[i].r ) max_rgb[0]=pixel[i].r;( max_rgb[1] < pixel[i].g ) max_rgb[1]=pixel[i].g;( max_rgb[2] < pixel[i].b ) max_rgb[2]=pixel[i].b;( min_rgb[0] > pixel[i].r ) min_rgb[0]=pixel[i].r;( min_rgb[1] > pixel[i].g ) min_rgb[1]=pixel[i].g;( min_rgb[2] > pixel[i].b ) min_rgb[2]=pixel[i].b;

}

(int i=0; i<3; i++)

{+=max_rgb[i];+=min_rgb[i];

}

=0.3*max_rgb[0]+0.59*max_rgb[1]+0.11*max_rgb[2]; //max яркость=0.3*min_rgb[0]+0.59*min_rgb[1]+0.11*min_rgb[2]; //min яркость

(int i=0; i<3; i++)[i]=(mxrgb+mnrgb)/2;

=fopen("rezult.txt","w");//файл результата(rez,"Method: global\n\n");

//алгоритм автоматического вычисления порога(abs(TTrgb[0]-Trgb[0])>T0 && abs(TTrgb[1]-Trgb[1])>T0 && abs(TTrgb[2]-Trgb[2])>T0 )//итерационный процесс

{=0;=0;=0;(int y=0;y<3;y++)[y]=Trgb[y];

(int i=0; i<pic[0].nRows;i++)//цикл по строкам

{(int j=0; j<pic[0].nCols; j++)//цикл по столбцам

{=pic[whichPic].func_glob_porog(ct,Trgb);//определение принадлежности пикселя


if (flag==1)//установка нового значения пикселя

{[whichPic].pixel_in_fone(ct);

(rez,"x=%i\ty=%i\tR=%i\tG=%i\tB=%i\tRGB=%lf\n",j,i,pixel[ct].r,pixel[ct].g,pixel[ct].b,0.3*pixel[ct].r+0.59*pixel[ct].g+0.11*pixel[ct].b);

[ct].r=cvet_fon;[ct].g=cvet_fon;[ct].b=cvet_fon;

po++;

}//установка нового значения пикселя (фон)

{[whichPic].pixel_in_object(ct);[ct].r=cvet_object;[ct].g=cvet_object;[ct].b=cvet_object;

++;

}++;

}

}(rez,"\n\nPixel_in_object = %i\nPixel_in_fone = %i\nPixel_in_image = %i\n",po,pf,ct);(rez);_flag=0;_flag=0;

(int q=0;q<3;q++)

{[q]=pic[whichPic].sred_rgb(pf,q,fon_or_object);//среднее по пикселям фона

}

[0]*=0.3;[1]*=0.59;[2]*=0.11;

_or_object=0;(int q=0;q<3;q++)

{[q]=pic[whichPic].sred_rgb(pf,q,fon_or_object);//среднее по пикселям объекта

}

[0]*=0.3;[1]*=0.59;[2]*=0.11;(int u=0;u<3;u++)[u]=(argb[u]+zrgb[u])/2;

}


}

//конец класса пиксельная карта


//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

//+++++++++++++++++ начало класса локальная обработка +++++++++++++++++++++

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++loc2al_class{

:aRows,aCols;raspred[255];dispers;mat_ozhid;** loc2al_img;** px1;

mRGB** px2;* a_pixel;//массив пикселов рисунка, подвергнувшегося адаптивной обработке*sksk;opred()//выделение памяти, определение необходимых переменных и т.д.

{adaptRows,adaptCols,a,b;=pic[whichPic].nRows/a_kol_razb;=pic[whichPic].nCols/a_kol_razb;=adaptRows;=adaptCols;=adaptRows*adaptCols;=a_kol_razb*a_kol_razb;

_pixel = new mRGB[pic[whichPic].nRows * pic[whichPic].nCols];al_img = new mRGB*[a];= new mRGB*[a];= new mRGB*[a];= new int[b];(int i=0;i<a;i++)

{al_img[i] = new mRGB[b];[i] = new mRGB[b];[i] = new mRGB[b];

}

}a_draw()//процедура рисования массива пикселей (Open GL)

{(pic[whichPic].nRows ==0 || pic[whichPic].nCols==0) return;(GL_UNPACK_ALIGNMENT,1);(pic[whichPic].nCols, pic[whichPic].nRows, GL_RGB, GL_UNSIGNED_BYTE,a_pixel);

}

//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

//Часть кода, расположенная ниже, была изменена в отчете для лучшего восприятия основных моментов, которые выполнялись при работе алгоритма

//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


//***** локальная пороговая обработка (главная процедура локальной обработки)

void loc2al_glob_porog()

{cvet_fon=0, cvet_object=255, skok, ct, fon_or_object=0, opred_prinadl_f=0,opred_prinadl_o=0;*only_oo,*only_ff, razm, flag, po, pf;*mxrgb,*mnrgb, T0=5.0;*file;= fopen("info.txt","w");=a_kol_razb*a_kol_razb;glob_pf=0,glob_po=0,glob_ct=0;

*max_rgb,*min_rgb,*Trgb,*TTrgb,*argb,*zrgb;_rgb = new mRGB[razm];_rgb = new mRGB[razm];= new double[razm];= new double[razm];_oo = new int[razm];_ff = new int[razm];= new mRGB[razm];= new mRGB[razm];= new mRGB[razm];= new mRGB[razm];

=aCols*aRows;

(int i=0;i<razm;i++)

{_oo[i]=0;_ff[i]=0;

}

(int i=0;i<razm;i++)

{[i].r=0;[i].g=0;[i].b=0;

_rgb[i].r=0;_rgb[i].g=0;_rgb[i].b=0;_rgb[i].r=0;_rgb[i].g=0;_rgb[i].b=0;

[i]=0;

mnrgb[i]=0;

}


// ШАГ 1: определяем для каждой области максимум и минимум по каждой из составляющей RGB(int k=0;k<razm;k++)//главный цикл по всем областям

{(int i=0;i<skok;i++)

{( max_rgb[k].r < loc2al_img[i][k].r ) max_rgb[k].r=loc2al_img[i][k].r;( max_rgb[k].g < loc2al_img[i][k].g ) max_rgb[k].g=loc2al_img[i][k].g;( max_rgb[k].b < loc2al_img[i][k].b ) max_rgb[k].b=loc2al_img[i][k].b;( min_rgb[k].r > loc2al_img[i][k].r ) min_rgb[k].r=loc2al_img[i][k].r;( min_rgb[k].g > loc2al_img[i][k].g ) min_rgb[k].g=loc2al_img[i][k].g;( min_rgb[k].b > loc2al_img[i][k].b ) min_rgb[k].b=loc2al_img[i][k].b;

}

// ШАГ 1: конец.


// ШАГ 2: вычисляем максимальную и минимальную яркость для каждой области

[k]=0.3*max_rgb[k].r+0.59*max_rgb[k].g+0.11*max_rgb[k].b;

mnrgb[k]=0.3*min_rgb[k].r+0.59*min_rgb[k].g+0.11*min_rgb[k].b;

// ШАГ 2: конец.


// ШАГ 3: вычисляем среднюю яркость для каждой области (пишем их во все составляющие RGB)[k].r=(mxrgb[k]+mnrgb[k])/2;[k].g=(mxrgb[k]+mnrgb[k])/2;[k].b=(mxrgb[k]+mnrgb[k])/2;

// ШАГ 3: конец.


//алгоритм автоматического вычисления порога(abs(TTrgb[k].r-Trgb[k].r)>T0 && abs(TTrgb[k].g-Trgb[k].g)>T0 && abs(TTrgb[k].b-Trgb[k].b)>T0 )

{=0;=0;=0;

// ШАГ 4: вычисляем среднюю яркость для каждой области (фиксирует ПРОШЛУЮ итерацию)

for(int kk=0;kk<razm;kk++)

{[kk].r=Trgb[kk].r;[kk].g=Trgb[kk].g;[kk].b=Trgb[kk].b;

}

// ШАГ 4: конец.

(int i=0; i<aRows; i++) //цикл по строкам

{(int j=0; j<aCols; j++)//цикл по столбцам

{=loc2al_func_glob_porog(ct,k,Trgb);//определение принадлежности пикселя

if (flag==1)//установка нового значения пикселя (фон)

{al_pixel_in_fone(ct,k);

pf++;_prinadl_f++;

}//установка нового значения пикселя (объект)

{al_pixel_in_object(ct,k);++;_prinadl_o++;

}++;

}

}(opred_prinadl_o==0) only_ff[k]++;//если в области только фон(opred_prinadl_f<loc2al_tochka_razbienija) only_oo[k]++;//если в области только объект


loc2al_i_flag=0;al_j_flag=0;

(file, "opred_prinadl_o=%i\tonly_ff[%i]=%i\topred_prinadl_f=%i\tonly_oo[%i]=%i\n",opred_prinadl_o,k,only_ff[k],opred_prinadl_f,k,only_oo[k]);


// ШАГ 5: вычисляем среднюю яркость для каждой области только по пикселям фона[k].r=loc2al_sred_rgb(pf,0,fon_or_object,k);//среднее по пикселям фона

argb[k].g=loc2al_sred_rgb(pf,1,fon_or_object,k);[k].b=loc2al_sred_rgb(pf,2,fon_or_object,k);

[k].r*=0.3;[k].g*=0.59;

argb[k].b*=0.11;

// ШАГ 5: конец._or_object=1;//теперь для объекта


// ШАГ 6: вычисляем среднюю яркость для каждой области только по пикселям объекта

[k].r=loc2al_sred_rgb(pf,0,fon_or_object,k);//среднее по пикселям объекта

zrgb[k].g=loc2al_sred_rgb(pf,1,fon_or_object,k);[k].b=loc2al_sred_rgb(pf,2,fon_or_object,k);

[k].r*=0.3;[k].g*=0.59;

zrgb[k].b*=0.11;

// ШАГ 6: конец.


// ШАГ 7: переход на следующую итерацию (мнимый, естественно)

Trgb[k].r=(argb[k].r+zrgb[k].r)/2;[k].g=(argb[k].g+zrgb[k].g)/2;[k].b=(argb[k].b+zrgb[k].b)/2;

// ШАГ 7: конец._prinadl_o=0;_prinadl_f=0;

}

}(file);


//**************** ок ************************(int i=0;i<razm;i++)

{[i].r=0;[i].g=0;[i].b=0;_rgb[i].r=0;_rgb[i].g=0;_rgb[i].b=0;

_rgb[i].r=0;_rgb[i].g=0;_rgb[i].b=0;

[i]=0;[i]=0;

}

=fopen("rezult.txt","w");(rez,"Method: adapt\n\n");

();_ozhida();();(int k=0;k<razm;k++)

{(int i=0;i<skok;i++)

{( max_rgb[k].r < loc2al_img[i][k].r ) max_rgb[k].r=loc2al_img[i][k].r;( max_rgb[k].g < loc2al_img[i][k].g ) max_rgb[k].g=loc2al_img[i][k].g;( max_rgb[k].b < loc2al_img[i][k].b ) max_rgb[k].b=loc2al_img[i][k].b;( min_rgb[k].r > loc2al_img[i][k].r ) min_rgb[k].r=loc2al_img[i][k].r;( min_rgb[k].g > loc2al_img[i][k].g ) min_rgb[k].g=loc2al_img[i][k].g;( min_rgb[k].b > loc2al_img[i][k].b ) min_rgb[k].b=loc2al_img[i][k].b;

}

[k]=max_rgb[k].r + max_rgb[k].g + max_rgb[k].b;[k]=min_rgb[k].r + min_rgb[k].g + min_rgb[k].b;

[k]=0.3*max_rgb[k].r+0.59*max_rgb[k].g+0.11*max_rgb[k].b;[k]=0.3*min_rgb[k].r+0.59*min_rgb[k].g+0.11*min_rgb[k].b;


//принимаем решение об изменении дисперсии объекта или фона

if(only_oo[k]>=aCols*aRows*0.1)

{[k].r=(mxrgb[k]+mnrgb[k])/2+loc2al_dispers_object;[k].g=(mxrgb[k]+mnrgb[k])/2+loc2al_dispers_object;[k].b=(mxrgb[k]+mnrgb[k])/2+loc2al_dispers_object;

}

{[k].r=(mxrgb[k]+mnrgb[k])/2+loc2al_dispers_fone;[k].g=(mxrgb[k]+mnrgb[k])/2+loc2al_dispers_fone;[k].b=(mxrgb[k]+mnrgb[k])/2+loc2al_dispers_fone;

}=0;=0;=0;

(int kk=0;kk<razm;kk++)

{[kk].r=Trgb[kk].r;[kk].g=Trgb[kk].g;[kk].b=Trgb[kk].b;

}

(rez,"\n\n sector №%i \n\n",k);(int i=0; i<aRows; i++)//цикл по строкам

{(int j=0; j<aCols; j++)//цикл по столбцам

{=loc2al_func_glob_porog(ct,k,Trgb);//определение принадлежности пикселя


if (flag==1)//установка нового значения пикселя

{al_pixel_in_fone(ct,k);(rez,"x=%i\ty=%i\tR=%i\tG=%i\tB=%i\tRGB=%lf\n",j,i,pixel[ct].r,pixel[ct].g,pixel[ct].b,0.3*pixel[ct].r+0.59*pixel[ct].g+0.11*pixel[ct].b);

al_img[ct][k].r=cvet_fon;al_img[ct][k].g=cvet_fon;al_img[ct][k].b=cvet_fon;

po++;_pf++;

}//установка нового значения пикселя

{al_pixel_in_object(ct,k);

al_img[ct][k].r=cvet_object;al_img[ct][k].g=cvet_object;al_img[ct][k].b=cvet_object;

++;_po++;

}++;_ct++;

}

}

(rez,"\n\nPixel_in_object = %i\nPixel_in_fone = %i\nPixel_in_image = %i\n",po,pf,ct);


al_i_flag=0;al_j_flag=0;

[k].r=loc2al_sred_rgb(pf,0,fon_or_object,k); //среднее по пикселям фона[k].g=loc2al_sred_rgb(pf,1,fon_or_object,k);[k].b=loc2al_sred_rgb(pf,2,fon_or_object,k);[k].r*=0.3;[k].g*=0.59;[k].b*=0.11;

_or_object=0;

[k].r=loc2al_sred_rgb(pf,0,fon_or_object,k); //среднее по пикселям объекта[k].g=loc2al_sred_rgb(pf,1,fon_or_object,k);[k].b=loc2al_sred_rgb(pf,2,fon_or_object,k);

[k].r*=0.3;[k].g*=0.59;[k].b*=0.11;[k].r=(argb[k].r+zrgb[k].r)/2;[k].g=(argb[k].g+zrgb[k].g)/2;[k].b=(argb[k].b+zrgb[k].b)/2;


}(rez,"\n VSEGO:\n\nPixel_in_object = %i\nPixel_in_fone = %i\nPixel_in_image = %i\n",glob_pf,glob_po,glob_ct);

fclose(rez);

//**************************************************


// ШАГ 8: переписываем все области в сплошной массив


int count,fun=0,sek=-1,ss=0;

(int k=0; k<razm; k++)

{=0;++;

(sek==a_kol_razb)

{=0;++;

}(int i=0; i<aRows; i++)

{(int j=0; j<aCols; j++)

{=j+aCols*a_kol_razb*i+k*aCols+fun*aCols*(aRows-1)*a_kol_razb;//вычисляем нужную область пикселей_pixel[ss].r=loc2al_img[count][k].r;_pixel[ss].g=loc2al_img[count][k].g;_pixel[ss].b=loc2al_img[count][k].b;++;

}

}

}

// ШАГ 8: конец.

}

};

al_class loc2;//элемент локальной обработки


//******************************************************************************

//******************************************************************************//*************класс дискриминантного критерия **************************//

//******************************************************************************

//******************************************************************************

//*** ТОЛЬКО ВЫЧИСЛЕНИЯ ПОРОГА!!!


class diskr_class{

:diskr_func[255];mat_ozhid_all_image;disp_all_image;p0,p1;m0,m1;klass_disp,raspred_func[255];porog[3];global_flag;

copy_histo(int flag)

{(flag) //выбираем для какой состовляющей цветового пространства определяем порог

{0: for(int i=0;i<255;i++)raspred_func[i]=histogramma[i][0]; global_flag=0; break;1: for(int i=0;i<255;i++)raspred_func[i]=histogramma[i][1]; global_flag=1; break;2: for(int i=0;i<255;i++)raspred_func[i]=histogramma[i][2]; global_flag=2; break;

}

}

memory()

{= new mRGB[pic[0].nRows * pic[0].nCols];= new mRGB[pic[0].nRows * pic[0].nCols];

}

mat_ozhid_all()//мат. ожидание всего изображения

{_ozhid_all_image=0;(int i=0;i<255;i++)_ozhid_all_image+=i*raspred_func[i];

}

disp_all()//дисперсия всего изображения

{(int i=0;i<255;i++)

{_all_image+=(i-mat_ozhid_all_image)*(i-mat_ozhid_all_image);

}

}


void info_everykadr(int k)//информация о всем кадре

{all=0;(int i=0;i<255;i++)+=raspred_func[i];

(int i=0;i<k;i++)+=raspred_func[i];//вероятность p0

(int i=k+1;i<255;i++)+=raspred_func[i];//вероятность p1

0/=all;//нормировка

p1/=all;


for(int i=0;i<k;i++)+=i*raspred_func[i];

=(mat_ozhid_all_image-m0)/p1;//мат. ожидания(p0!=0)m0/=p0;

}


void megklass_disp()//вычисление межклассовой дисперсии

{_disp=p0*(m0-mat_ozhid_all_image)*(m0-mat_ozhid_all_image)+p1*(m1-mat_ozhid_all_image)*(m1-mat_ozhid_all_image);

}


int diskrmnt_main(int what)//главная функция дискриминантной обработки

{max;porg=0;*f2;=fopen("diskr_info.txt","w");=0;=0;=0;=0;=0;_disp=0;

_histo(what);//получаем распределение

mat_ozhid_all();//мат. ожидание всего изображения

disp_all();//дисперсия всего изображения

memory();//выделение памяти


for(int i=0;i<255;i++)

{=0;=0;=0;=0;_everykadr(i);_disp();_func[i]=klass_disp/disp_all_image;

}


for(int i=0;i<255;i++)//вычисляем абсолютный максимум дискриминантной функции

if(diskr_func[i]>max)

{=diskr_func[i];[global_flag]=i;

}(int i=0;i<3;i++)

{(f2,"porog[%i]=%i\n",i,porog[i]);

}(f2);porog[global_flag];

}

};

//******************************************************************************

//******************************************************************************

//**************** конец класс дискремининтного критерия*******************//

//******************************************************************************//******************************************************************************

_class diskr;//элемент класса дискриминантная обработка


//******************************************************************************

//******************************************************************************

//******************************************класс адаптивной обработки ******

//******************************************************************************//******************************************************************************adp_class{


public:pxmp;

copy_1D_to_2D()

{ct;** new_mass;_mass = new mRGB*[pxmp.nRows];(int i=0;i<pxmp.nRows;i++)_mass[i] = new mRGB[pxmp.nCols];

=-1;(int i=0;i<pxmp.nRows;i++)

{(int j=0;j<pxmp.nCols;j++)

{++;_mass[i][j]=pixel[ct];

}

}


}

obl_vich_intensiv(int m, int n, int obl)//вычисляем текущее территориальное расположение пикселя

{

int ct=0;

switch(obl)//определяем область вокруг центрального пикселя

{

case 0: //левый нижний угол

for(int j=n;j<n+KK+1;j++)

for(int i=m;i<m+1+KK;i++)

{(i!=m && j!=n) mass_obl[ct]=pxmp.getPixel(i,j);++;

};

1: //нижняя граница(int j=n;j<n+KK+1;j++)(int i=m-KK;i<m+1+KK;i++)

{(i!=m && j!=n) mass_obl[ct]=pxmp.getPixel(i,j);++;

};

3: //правая граница(int j=n-KK;j<n+KK+1;j++)(int i=m-KK;i<m+1;i++)

{(i!=m && j!=n) mass_obl[ct]=pxmp.getPixel(i,j);++;

}

break;


case 2: //правый нижний угол

for(int j=n;j<n+KK+1;j++)(int i=m-KK;i<m+1;i++)

{(i!=m && j!=n) mass_obl[ct]=pxmp.getPixel(i,j);++;

}

break;


case 4: //правый верхний угол

for(int j=n-KK;j<n+1;j++)(int i=m-KK;i<m+1;i++)

{(i!=m && j!=n) mass_obl[ct]=pxmp.getPixel(i,j);++;

};

5: //верхняя граница(int j=n-KK;j<n+1;j++)(int i=m-KK;i<m+1+KK;i++)

{(i!=m && j!=n) mass_obl[ct]=pxmp.getPixel(i,j);++;

}

break;


case 6: //левый верхний угол

for(int j=n-KK;j<n+1;j++)(int i=m;i<m+1+KK;i++)

{(i!=m && j!=n) mass_obl[ct]=pxmp.getPixel(i,j);++;

};

7: //левая граница(int j=n-KK;j<n+1+KK;j++)(int i=m;i<m+1+KK;i++)

{(i!=m && j!=n) mass_obl[ct]=pxmp.getPixel(i,j);++;

};

8: //центральная область(int j=n-KK;j<n+1+KK;j++)(int i=m-KK;i<m+1+KK;i++)

{(i!=m && j!=n && i>=0 && j>=0) mass_obl[ct]=pxmp.getPixel(i,j);++;

};

}


}

vich_loc_intensiv_tchk()//основная процедура адаптивной обработки

{sred_intens, delta_max, delta_min,t;*f5;tek;newcolor_o,newcolor_f;null;*px;= new mRGB[pic[0].nCols*pic[0].nRows];tek_intens;max=0,fflag;min=0;po=0,pf=0,ct=0;

_intens=0.0;

_o.r=255;//новый цвет объекта_o.g=255;_o.b=255;

_f.r=0;//новый цвет фона_f.g=0;_f.b=0;

.r=0;.g=0;.b=0; oblast=(2*KK+1)*(2*KK+1);//вычисляем область соседей

for(int i=0;i<oblast-1;i++)

{_obl[i]=null;

}=0;

=fopen("rezult.txt","w");//файл результата(rez,"Method: adapt\n\n");


//обработка всей сетки(int i=0;i<pic[0].nRows;i++)

{(int j=0;j<pic[0].nCols;j++)

{//различные ситуации(i==0 && j==0)obl_vich_intensiv(j,i,0);(i==0 && j==pic[0].nCols-1)obl_vich_intensiv(j,i,2);(i==0 && j!=0)obl_vich_intensiv(j,i,1);(j==pic[0].nCols-1 && i!=pic[0].nRows-1)obl_vich_intensiv(j,i,3);(j==pic[0].nCols-1 && i==pic[0].nRows-1)obl_vich_intensiv(j,i,4);(i==pic[0].nRows-1 && j!=0)obl_vich_intensiv(j,i,5);(j==0 && i==pic[0].nRows-1)obl_vich_intensiv(j,i,6);(j==0 && i!=0)obl_vich_intensiv(j,i,7);(i!=0 && j!=0 && i!=pic[0].nRows-1 && j!=pic[0].nCols-1)obl_vich_intensiv(j,i,8);

=pic[0].getPixel(j,i);_intens=0.3*tek.r+0.59*tek.g+0.11*tek.b; //яркость(int k=0;k<oblast-1;k++)

{_intens+=0.3*mass_obl[k].r+0.59*mass_obl[k].g+0.11*mass_obl[k].b;//средняя интенсивность в точке

}_intens/=oblast;(sred_intens>max) max=sred_intens; //максимум(sred_intens<min) min=sred_intens; //минимум

_max=abs(max-sred_intens); //приращение max_min=abs(min-sred_intens); //приращение min

(delta_max>delta_min)t=alfa*(2./3.*min+1./3.*sred_intens);//определяем параметр tt=alfa*(1./3.*min+2./3.*sred_intens);


ct++;

( (sred_intens-tek_intens)>t)//условие принадлежности пикселя объекту

{[0].setPixel(j,i,newcolor_f);(rez,"x=%i\ty=%i\tR=%i\tG=%i\tB=%i\tRGB=%lf\n",j,i,tek.r,tek.g,tek.b,tek_intens);++;

}

{[0].setPixel(j,i,newcolor_o);++;

}++;

}

}

(rez,"\n\nPixel_in_object = %i\nPixel_in_fone = %i\nPixel_in_image = %i\n",po,pf,ct);(rez);

}

everything()

{_1D_to_2D();_loc_intensiv_tchk();

}


};

//******************************************************************************

//******************************************************************************

//*********************************** конец класс адаптивной обработки *********

//******************************************************************************

//******************************************************************************

_class lc; //элемент класса адаптивная обработка

//процедура непосредственного перераспределения пикселей к классам для дискриминантного метода

int func_adpt_porog(int num,int porog[3])

{rez=0;

(pixel[num].r<=porog[0] && pixel[num].g<=porog[1] && pixel[num].b<=porog[2]) rez=1;rez=0;rez;

}

adpt_segmentation()

{ct=0;cvet_fon,cvet_object,po,pf,flag;

_fon=0;_object=255;=0;=0;=0;_flag=0;_flag=0;(int i=0; i<pic[0].nRows;i++)//цикл по строкам

{(int j=0; j<pic[0].nCols; j++)//цикл по столбцам

{=func_adpt_porog(ct,adpt_porog);//определение принадлежности пикселя


if (flag==1)//установка нового значения пикселя (фон)

{[whichPic].pixel_in_fone(ct);

(rez,"x=%i\ty=%i\tR=%i\tG=%i\tB=%i\tRGB=%lf\n",j,i,pixel[ct].r,pixel[ct].g,pixel[ct].b,0.3*pixel[ct].r+0.59*pixel[ct].g+0.11*pixel[ct].b);[ct].r=cvet_fon;[ct].g=cvet_fon;[ct].b=cvet_fon;

po++;

}//установка нового значения пикселя (объект)

{[whichPic].pixel_in_object(ct);

[ct].r=cvet_object;[ct].g=cvet_object;[ct].b=cvet_object;++;

}++;

}

}(rez,"\n\nPixel_in_object = %i\nPixel_in_fone = %i\nPixel_in_image = %i\n",po,pf,ct);

}

//инвертирование изображения

void invert()

{

int ct;

int c=1;=-1;(int i=0;i<pic[0].nRows;i++)

{(int j=0;j<pic[0].nCols;j++)

{++;[ct].r=255-pixel[ct].r;[ct].g=255-pixel[ct].g;[ct].b=255-pixel[ct].b;

}

}

}


//построение гистограммbuild_histogramma()

{

(int i=0;i<256;i++)(int j=0;j<3;j++)

{[i][j]=0;

}(int i=0;i<pic[whichPic].nCols*pic[whichPic].nRows;i++)

{[pixel[i].r][0]++;[pixel[i].g][1]++;[pixel[i].b][2]++;

}


}


//****** обработка вывода на экран гистограммы R (Open GL) *********************myDisplayHistoR(void)

{a=0;=256+otstyp;(1.0,1.0,1.0,0.0);(GL_COLOR_BUFFER_BIT);f(1.0,0.0,0.0);(GL_LINES);(int i=otstyp;i<a;i++)

{i(i,0);i(i,histogramma[i-otstyp][0]/delR);

}();();

}


//**********обработка действий клавиатурой (Open GL)*******//

//основная идея запуска каждой из обработок

void myKeys(unsigned char key, int x, int y)

{(key)

{'q': exit(0);'s': whichPic=1-whichPic; break;'p': pic[0].read(0,0,200,200); break;'a': loc2.loc2al_glob_porog(); what_draw=2; break; //локальная пороговая обработка'i': pic[whichPic].copy_image(pixel,pixel2); what_draw=1; break; //восстановление исходного изображения'g': glob_porog(); what_draw=1; break; //глобальная пороговая обработка'l': lc.everything(); what_draw=1; break; //адаптивная пороговая обработка'd': rez=fopen("rezult.txt","w");(rez,"Method: diskriminant\n\n");(int i=0;i<3;i++) //вычисляем порог для каждой из составляющих R,G и B

adpt_porog[i]=diskr.diskrmnt_main(i);

_segmentation();//дискриминантная сегментация_draw=1;(rez);;'e': etalon_videl_only_black(); what_draw=1; break; //выделение эталона'o': invert(); what_draw=1; break;//инвертирование


}();//обновления экрана (Open GL)

}

}


Примеры обработки событий (Windows Forms):

#pragma once


#include "windows.h"

#include "iostream"

#include <conio.h>


#include "PROG.CPP"//основной файл со всеми важнейшими классами и обработками изображения

#include "FormHelp.h"//библиотека ПОМОЩЬ

#include "stdafx.h"

#include "ShowImage.h"//библиотека изображения (вывода на экран)

#include "ok.h"//библиотека отдельной глобальной обработки

#include "histo.h"//библиотека гистограмм

#include "loc.h"//библиотека отдельной локальной обработки

#include "Diskr.h"//библиотека отдельной обработки методом дискриминантного критерия

#include "Adapt.h"//библиотека отдельной адаптивной обработки

using namespace std;

Interface {//пространство ИНТЕРФЕЙС


//использование функций, классов и т.д. следующих компонент:namespace System;namespace System::ComponentModel;namespace System::Collections;namespace System::Windows::Forms;namespace System::Data;namespace System::Drawing;

ref class Form1 : public System::Windows::Forms::Form

{:(void)

{

();//параметры основной формы


//

//TODO: Add the constructor code here

//

}:

/// <summary>

/// Clean up any resources being used.

/// </summary>

~Form1()

{(components)

{components;

}

}

private: System::Windows::Forms::Button^ button1;: System::Windows::Forms::GroupBox^ groupBox1;: System::Windows::Forms::Button^ OpenImage;: System::Windows::Forms::TextBox^ ImageTextBox;

: System::Windows::Forms::OpenFileDialog^ openFileDialog1;: System::Windows::Forms::GroupBox^ groupBox2;: System::Windows::Forms::GroupBox^ groupBox3;

//и так далее. Здесь определяются все объекты, расположенные на форме.

#pragma region Windows Form Designer generated code

/// <summary>

/// Required method for Designer support - do not modify

/// the contents of this method with the code editor.

/// </summary>


//генерируется код для обработки всех свойств всех объектовInitializeComponent(void)

{

//инициализация всех объектов>button1 = (gcnew System::Windows::Forms::Button());>groupBox1 = (gcnew System::Windows::Forms::GroupBox());>OpenImage = (gcnew System::Windows::Forms::Button());

// button1

//>button1->BackColor = System::Drawing::Color::Azure;>button1->Location = System::Drawing::Point(0, 14);>button1->Name = L"button1";>button1->Size = System::Drawing::Size(139, 21);>button1->TabIndex = 0;>button1->Text = L"Описание программы";>button1->UseVisualStyleBackColor = false;>button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);

//и так далее. Здесь определяются все основные свойства объектов, расположенных на форме.


//пример обработка нажатия кнопки "кнопка помощь": System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { FormHelp ^f = gcnew FormHelp;>ShowDialog();


}

//пример обработки нажатия кнопки "показать изображение": System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {

//*************************************************

//ручной перевод из типа String^ в Char*

//*************************************************b=1;^ fn=openFileDialog1->FileName;(fn=="") b=0;z;*r1,*g1,*b1;

*qwerty,qw;wq;l;

=openFileDialog1->FileName->Length;=new char[l];(int i=0;i<l;i++){[i]=Convert::ToInt16(openFileDialog1->FileName[i]);

}

kol=0;=qwerty[2];(int i=0;i<l;i++)

{(qwerty[i]==qw)++;

}*ir;= new char[l+kol+1];(int i=0,j=0;i<l+kol;i++,j++)

{[i]=qwerty[j];(ir[i]==qw) { i++; ir[i]=qw; }

}[l+kol]='\0';

//*************************************************

//конец ручного перевода из типа String^ в Char*

//*************************************************

::filename=ir;//передаем в присоединенную PROG.CPP параметр

( checkBox1->Checked==1)

{=1;

g=globa::main2();

= new int[globa::pic[globa::whichPic].nCols*globa::pic[globa::whichPic].nRows];= new int[globa::pic[globa::whichPic].nCols*globa::pic[globa::whichPic].nRows];= new int[globa::pic[globa::whichPic].nCols*globa::pic[globa::whichPic].nRows];

ct=-1;(int i=0;i<globa::pic[globa::whichPic].nRows;i++)//если есть инвертирование изображения

{(int j=0;j<globa::pic[globa::whichPic].nCols;j++)

{++;::pixel[ct].r=255-globa::pixel[ct].r;::pixel[ct].g=255-globa::pixel[ct].g;::pixel[ct].b=255-globa::pixel[ct].b;

}

}=-1;(int i=0;i<globa::pic[globa::whichPic].nRows;i++)

{(int j=0;j<globa::pic[globa::whichPic].nCols;j++)

{++;[ct]=globa::pixel[ct].r;[ct]=globa::pixel[ct].g;[ct]=globa::pixel[ct].b;

}

}

}

^si = gcnew ShowImage(b,z,globa::pic[globa::whichPic].nRows,globa::pic[globa::whichPic].nCols,r1,g1,b1,fn);//создаем изображение и вызываем функцию на другой форме(b==1) si->ShowDialog();

}

//пример вывода изображения на экран с использованием Windows Forms и //сформированного массива pixel[] в программе PROG.CPPref class ShowImage : public System::Windows::Forms::Form

{:(int a, int y,int CC, int RR,int *r, int *g, int *b, String^ filename)

{H,W;(a==1)

{^ MyImage;= gcnew Bitmap(filename);//создаем тип Bitmap^ MyImage2;= gcnew Bitmap(filename);=MyImage->Height;=MyImage->Width;

(y==1)

{ct=RR*CC;(int i=0;i<CC;i++)

{(int j=0;j<RR;j++)

{-;>SetPixel(RR-j- //устанавливаем пиксели1,i,Color::FromArgb(r[ct],g[ct],b[ct]));

}

}

}(W,H);>ClientSize = System::Drawing::Size( W, H );>Image = dynamic_cast<Image^>(MyImage);

}

if(a==0) {^ message;="Ошибка!";::Show("Файл не был выбран!",message);

}


}


//пример вывода сообщения на экран: System::Void Developer_Click(System::Object^ sender, System::EventArgs^ e) {^ message;="Разработчик:";::Show("Bachelor Version 2.2\nКартавцев А.М., пм-51 (2009г.)",message);

}


//основная программа запуска

#include "stdafx.h"

#include "Form1.h"

namespace Interface;


[STAThreadAttribute]main(array<System::String ^> ^args)

{b;


// Enabling Windows XP visual effects before any controls are created

//b=main2();

::EnableVisualStyles();::SetCompatibleTextRenderingDefault(false);

// Create the main window and run it::Run(gcnew Form1());//запускаем основную форму

0;

}