<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Работа для  программистов &#187; .NET</title>
	<atom:link href="http://job-interview.ru/articles/post/tag/net/feed" rel="self" type="application/rss+xml" />
	<link>http://job-interview.ru/articles</link>
	<description>вакансии, вопросы, статьи</description>
	<lastBuildDate>Thu, 29 Mar 2012 20:53:41 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Выделение областей изображения со схожими цветовыми характеристиками</title>
		<link>http://job-interview.ru/articles/post/362</link>
		<comments>http://job-interview.ru/articles/post/362#comments</comments>
		<pubDate>Thu, 29 Mar 2012 20:30:50 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[Алгоритмы]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[MatLab]]></category>
		<category><![CDATA[изображения]]></category>

		<guid isPermaLink="false">/articles/?p=362</guid>
		<description><![CDATA[
Сегодня на рынке программных продуктов можно найти огромный выбор средств для обработки изображений. Есть и такие гиганты как Adobe Photoshop и просто любительские программы, написанные студентами для курсовых проектов. Поэтому выбор пользователя в этом плане велик. В этой статье я не буду обсуждать программные средства для обработки изображений, аналитических статей на этот счет предостаточно. Тут [...]]]></description>
			<content:encoded><![CDATA[<p>
Сегодня на рынке программных продуктов можно найти огромный выбор средств для <strong>обработки изображений</strong>. Есть и такие гиганты как <em>Adobe Photoshop</em> и просто любительские программы, написанные студентами для курсовых проектов. Поэтому выбор пользователя в этом плане велик. В этой статье я не буду обсуждать программные средства для обработки изображений, аналитических статей на этот счет предостаточно. Тут я хочу рассмотреть очень подробно лишь только один маленький пункт из огромного количества предложенных путей обработки изображений.
</p>
<p>
<strong>Обработка изображений</strong> сейчас модное направление в области разработки <em>программного обеспечения</em>. Начать обработку изображения можно уже на стадии фотографирования.  По поводу качества такой обработки сказать ничего не могу, но такие возможности фотоаппаратов, как <strong>обнаружение лица</strong> и других объектов вполне себе работают и причем неплохо. Другое дело – это <em>распознавание лиц</em>, тут пока технологии отстают. Мой ноутбук никак не хочет идентифицировать меня по лицу!
</p>
<p><span id="more-362"></span></p>
<p>
Основой  обработки изображения является выделение области изображения со схожими характеристиками, такое, как, например, выделение образов. Список <strong>алгоритмов</strong> для выделения образов или сегментов уже давно известен и обсуждается многими. Хотя, что значит обсуждается? Просто добавляется каждый раз новая статистика по работе алгоритмов на практике &#8211;  как работает, с какой точностью.
</p>
<p>
Когда я слышу о задаче выделения областей,  у меня сразу возникает несколько вопросов:
</p>
<blockquote><p>
&mdash; По какому критерию производить сравнение?<br />
&mdash; Как определить, что пиксели относятся к одной области?
</p></blockquote>
<p>
Начнем с первого пункта. Тут я постараюсь описать все довольно просто.
</p>
<p>
Все изображение состоит из маленьких частиц-пикселей. На сегодняшний день <strong>пиксель</strong> может быть представлен двумя способами – это с помощью <strong>RGB</strong> или <strong>YCrCb</strong>. Это так называемое представление цветного пространства пикселя. Между двумя этими представлениями существуют формулы перехода от одного пространства к другому. На мой взгляд, цветное пространство YCbCr используется только в формате кодирования <strong>JPEG</strong>, так как позволяет значительно уменьшить хранимую информацию о пикселях. При работе с <em>растровыми изображениями</em> для анализа чаще всего рассматривают формат представления RGB, хотя в последнее время к нему добавили еще одну компоненту – это так называемая &#8220;<em>яркость</em>&#8220;. Таким образом, для рассмотрения алгоритмов в этой статье я выбираю представление пикселей в RGB &#8211; пространстве, при необходимости может добавится еще одна, четвертая компонента.
</p>
<p>
Вопрос отнесения пикселей к одной области изображения представляет собой  интересную задачу. <strong>Алгоритм</strong>, который определяет отношение пикселя к заданной области, называется «<strong>Выращивание регионов, дробление-слияние</strong>».  Смысл метода в том, чтобы постепенно добавлять к определённой области пиксели, удовлетворяющие характеристикам области.
</p>
<p>
Для присоединения пикселя к области  существует несколько алгоритмов. Это и алгоритм &#8220;<strong>k-средних</strong>&#8220;, и &#8220;<strong>watershed</strong>&#8221; алгоритм. Смысл алгоритмов определить критерий, границу, по которой будет происходить отбор пикселей.
</p>
<p>
Для выбора этой границы произведем <strong>анализ изображения</strong>. Будем оценивать изображение по распределению пикселей и их значению. Наиболее популярный инструмент для разработки и анализа алгоритмов, на мой взгляд, это <strong>Matlab</strong>. В последних версиях Matlab появился <strong>ToolBox</strong> для обработки и анализа изображения. Тут реализованы почти все функции, которые необходимы для этого.
</p>
<p>
Одна из самых популярных функций в Matlab для анализа – это <strong>построение гистограмм</strong>. Тут надо заметить, что стандартная функция для считывания изображения в память – это <em>imread()</em>. Это функция на выходе формирует трехмерный массив пикселей, где число строк и столбцов равно ширине и высоте изображения соответственно. Итак, после применения этой функции получаем массивы пикселей в пространстве RGB.
</p>
<p>
Для построения гистограммы требуется одномерный массив, поэтому построим три гистограммы.
</p>
<p>
Наше изображение
</p>
<p>
<img src="http://job-interview.ru/img/segmentation/1.png" align="center" border="0">
</p>
<p>
Для построения гистограмм изображений предусмотрен специальный инструмент <em>imhist</em>, который строит распределения пикселей по цветам (256 цветов).
</p>
<p>
Гистограммы по трем матрицам.
</p>
<p>
<img src="http://job-interview.ru/img/segmentation/2.png" align="center" border="0">
</p>
<p>
<img src="http://job-interview.ru/img/segmentation/3.png" align="center" border="0">
</p>
<p>
<img src="http://job-interview.ru/img/segmentation/4.png" align="center" border="0">
</p>
<p>
Исходя из анализа гистограмм, сразу приходит идея о том, чтобы построить разделение на объекты при помощи разделения на цвета. То есть, тут можно отталкиваться от предположения, что, если, например, на значение пикселя в <strong>голубом канале</strong> приходится более 10000 пикселей, то эти пиксели, скорее всего, относятся к одной области. Для проверки были реализованы такие функции, которые показали следующий результат.
</p>
<p>
<img src="http://job-interview.ru/img/segmentation/5.png" align="center" border="0">
</p>
<p>
<img src="http://job-interview.ru/img/segmentation/6.png" align="center" border="0">
</p>
<p>
<img src="http://job-interview.ru/img/segmentation/7.png" align="center" border="0">
</p>
<p>
Эти результаты были получены, если принять гипотезу о том, что одинаковые пиксели соответствуют одной области.
</p>
<p>
Здесь мы постарались выделить области пикселей, которых наибольшее  количество в канале, далее можно использовать <em>рекуррентную функцию</em> для выделения подобных областей до тех пор, пока изображение не будет разбито на области по значению пикселей.
</p>
<p>
Для получения данного результата был применен следующий цикл.
</p>
<p>
<div class="wp_syntax"><div class="code"><pre class="matlab" style="font-family:monospace;"><span style="color: #0000FF;">for</span> <span style="color: #33f;">i</span>=<span style="color: #33f;">1</span>:<span style="color: #33f;">1</span>:x
  <span style="color: #0000FF;">for</span> <span style="color: #33f;">j</span>=<span style="color: #33f;">1</span>:<span style="color: #33f;">1</span>:y
    <span style="color: #0000FF;">if</span><span style="color: #080;">&#40;</span><span style="color: #0000FF;">abs</span><span style="color: #080;">&#40;</span> fgrey<span style="color: #080;">&#40;</span><span style="color: #33f;">i</span>,<span style="color: #33f;">j</span><span style="color: #080;">&#41;</span>-position <span style="color: #080;">&#41;</span> &lt; <span style="color: #33f;">2</span><span style="color: #080;">&#41;</span>
      fgrey<span style="color: #080;">&#40;</span><span style="color: #33f;">i</span>,<span style="color: #33f;">j</span><span style="color: #080;">&#41;</span>=t;
      count=count+<span style="color: #33f;">1</span>;
    <span style="color: #0000FF;">end</span>
  <span style="color: #0000FF;">end</span>
<span style="color: #0000FF;">end</span></pre></div></div>

</p>
<p>
Здесь position &#8211; это значение пикселей, по которым происходит выборка областей. В этом выражении принимается поправка, что отклонение от выбранного значения может составлять 2 пункта.
</p>
<p>
Метод простой и легко реализуемый, хотя, конечно, он далек от совершенства. Вот тут я могу предложить небольшую модификацию метода, которая будет рассмотрена ниже.
</p>
<p>
В основе модификации лежит предположение о том, что значения пикселей в одной области или сегменте меняются постепенно, то есть осуществляется плавный переход. Например, в нашем изображении цвет неба плавно меняется от темного голубого к голубому. Этот метод больше похож на <strong>метод наращивания областей</strong>.
</p>
<p>
Рассмотрим тут его упрощенный вариант.
</p>
<p>
Будем рассматривать массив пикселей из трех подряд идущих значений. В нашем случае возьмем три пикселя. Найдем их среднее значение.
</p>
<p>
<div class="wp_syntax"><div class="code"><pre class="matlab" style="font-family:monospace;">среднее=<span style="color: #080;">&#40;</span>f<span style="color: #080;">&#40;</span><span style="color: #33f;">i</span>-<span style="color: #33f;">1</span>,<span style="color: #33f;">j</span>,z<span style="color: #080;">&#41;</span>+f<span style="color: #080;">&#40;</span><span style="color: #33f;">i</span>,<span style="color: #33f;">j</span>,z<span style="color: #080;">&#41;</span>+f<span style="color: #080;">&#40;</span><span style="color: #33f;">i</span>+<span style="color: #33f;">1</span>,<span style="color: #33f;">j</span>,z<span style="color: #080;">&#41;</span><span style="color: #080;">&#41;</span>/<span style="color: #33f;">3</span>;</pre></div></div>

</p>
<p>
Это значение примем за основу. Далее будем наращивать области, также используя три подряд идущих пикселя. Если разница значений удовлетворяет заданному критерию, то мы присоединяем эту область к исходной области, если нет, отбрасываем. Для трех матриц получаем следующий результат.
</p>
<p>
<img src="http://job-interview.ru/img/segmentation/8.png" align="center" border="0">
</p>
<p>
То есть мы видим, что изображение распадается на области с одинаковыми цветовыми значениями.
</p>
<p>
Функция для нахождения среднего по трем пикселям.
</p>
<p>
<div class="wp_syntax"><div class="code"><pre class="matlab" style="font-family:monospace;"><span style="color: #0000FF;">for</span> z=<span style="color: #33f;">1</span>:<span style="color: #33f;">1</span>:<span style="color: #33f;">3</span>
  <span style="color: #0000FF;">for</span> <span style="color: #33f;">i</span>=<span style="color: #33f;">2</span>:<span style="color: #33f;">3</span>:x-<span style="color: #33f;">1</span>
    <span style="color: #0000FF;">for</span> <span style="color: #33f;">j</span>=<span style="color: #33f;">1</span>:<span style="color: #33f;">1</span>:y 
      dev=<span style="color: #080;">&#40;</span>f<span style="color: #080;">&#40;</span><span style="color: #33f;">i</span>-<span style="color: #33f;">1</span>,<span style="color: #33f;">j</span>,z<span style="color: #080;">&#41;</span>+f<span style="color: #080;">&#40;</span><span style="color: #33f;">i</span>,<span style="color: #33f;">j</span>,z<span style="color: #080;">&#41;</span>+f<span style="color: #080;">&#40;</span><span style="color: #33f;">i</span>+<span style="color: #33f;">1</span>,<span style="color: #33f;">j</span>,z<span style="color: #080;">&#41;</span><span style="color: #080;">&#41;</span>/<span style="color: #33f;">3</span>;
      <span style="color: #0000FF;">if</span><span style="color: #080;">&#40;</span>dev~=<span style="color: #33f;">0</span><span style="color: #080;">&#41;</span>
	<span style="color: #0000FF;">break</span>;
      <span style="color: #0000FF;">end</span>
    <span style="color: #0000FF;">end</span>
  <span style="color: #0000FF;">end</span>
<span style="color: #0000FF;">end</span></pre></div></div>

</p>
<p>
Функция для выделения областей.
</p>
<p>
<div class="wp_syntax"><div class="code"><pre class="matlab" style="font-family:monospace;"><span style="color: #0000FF;">for</span> z=<span style="color: #33f;">1</span>:<span style="color: #33f;">1</span>:<span style="color: #33f;">3</span>
  <span style="color: #0000FF;">for</span> <span style="color: #33f;">i</span>=<span style="color: #33f;">2</span>:<span style="color: #33f;">3</span>:x-<span style="color: #33f;">1</span>
    <span style="color: #0000FF;">for</span> <span style="color: #33f;">j</span>=<span style="color: #33f;">1</span>:<span style="color: #33f;">1</span>:y
      devnew=<span style="color: #080;">&#40;</span>f<span style="color: #080;">&#40;</span><span style="color: #33f;">i</span>-<span style="color: #33f;">1</span>,<span style="color: #33f;">j</span>,z<span style="color: #080;">&#41;</span>+f<span style="color: #080;">&#40;</span><span style="color: #33f;">i</span>,<span style="color: #33f;">j</span>,z<span style="color: #080;">&#41;</span>+f<span style="color: #080;">&#40;</span><span style="color: #33f;">i</span>+<span style="color: #33f;">1</span>,<span style="color: #33f;">j</span>,z<span style="color: #080;">&#41;</span><span style="color: #080;">&#41;</span>/<span style="color: #33f;">3</span>;
      <span style="color: #0000FF;">if</span><span style="color: #080;">&#40;</span><span style="color: #080;">&#40;</span>dev-devnew<span style="color: #080;">&#41;</span>&lt;<span style="color: #33f;">0.1</span><span style="color: #080;">&#41;</span>
	dev=devnew;
	f<span style="color: #080;">&#40;</span><span style="color: #33f;">i</span>-<span style="color: #33f;">1</span>,<span style="color: #33f;">j</span>,z<span style="color: #080;">&#41;</span>=<span style="color: #33f;">0</span>;
	f<span style="color: #080;">&#40;</span><span style="color: #33f;">i</span>,<span style="color: #33f;">j</span>,z<span style="color: #080;">&#41;</span>=<span style="color: #33f;">0</span>;
	f<span style="color: #080;">&#40;</span><span style="color: #33f;">i</span>+<span style="color: #33f;">1</span>,<span style="color: #33f;">j</span>,z<span style="color: #080;">&#41;</span>=<span style="color: #33f;">0</span>;
      <span style="color: #0000FF;">end</span>
    <span style="color: #0000FF;">end</span>
  <span style="color: #0000FF;">end</span>
<span style="color: #0000FF;">end</span></pre></div></div>

</p>
<p>
Погрешность для трех пикселей принята равным 0.1, данный параметр можно изменить, но для этого изображения параметр 0.1 является наилучшим.
</p>
<p>
Таким образом, после применения всех фильтров мы получаем следующее изображение.
</p>
<p>
<img src="http://job-interview.ru/img/segmentation/9.png" align="center" border="0">
</p>
<p>
Визуальная оценка показывает, что выделение области вторым методом, дает более плавные переходы из одной области в другую.
</p>
<p>
Дальнейшее улучшение результатов даст возможность выделить области. Для этого надо использовать метод выделения пограничных контуров.
</p>
<p>
Тут можно использовать алгоритм выращивания областей от точки. Выбирая точку в пространстве пикселей, если она удовлетворяет заданному значению, мы присоединяем точку, если нет, пропускаем. Похоже на второй алгоритм, но тут идет привязка только по связным областям.
</p>
<p>
Например, выбирается точка из заданной области point(i,j), далее ищется точка со схожими значения в окружающем пространстве.
</p>
<p>
<div class="wp_syntax"><div class="code"><pre class="matlab" style="font-family:monospace;"><span style="color: #0000FF;">for</span> <span style="color: #33f;">j</span>=point_j:<span style="color: #33f;">1</span>:y
  <span style="color: #0000FF;">if</span><span style="color: #080;">&#40;</span>F<span style="color: #080;">&#40;</span>point_i,<span style="color: #33f;">j</span><span style="color: #080;">&#41;</span>~=<span style="color: #33f;">0</span><span style="color: #080;">&#41;</span>
    <span style="color: #080;">&#91;</span>point_i,<span style="color: #33f;">j</span><span style="color: #080;">&#93;</span>=Point<span style="color: #080;">&#40;</span>F,point_i-<span style="color: #33f;">1</span>,<span style="color: #33f;">j</span><span style="color: #080;">&#41;</span>;
  <span style="color: #0000FF;">else</span>
    <span style="color: #0000FF;">for</span> z=<span style="color: #33f;">1</span>:<span style="color: #33f;">1</span>:<span style="color: #33f;">3</span>
      f<span style="color: #080;">&#40;</span><span style="color: #33f;">i</span>-<span style="color: #33f;">2</span>,<span style="color: #33f;">j</span>,z<span style="color: #080;">&#41;</span>=<span style="color: #33f;">0</span>;
      f<span style="color: #080;">&#40;</span><span style="color: #33f;">i</span>-<span style="color: #33f;">1</span>,<span style="color: #33f;">j</span>,z<span style="color: #080;">&#41;</span>=<span style="color: #33f;">0</span>;
      f<span style="color: #080;">&#40;</span><span style="color: #33f;">i</span>,<span style="color: #33f;">j</span>,z<span style="color: #080;">&#41;</span>=<span style="color: #33f;">0</span>;
    <span style="color: #0000FF;">end</span>
  <span style="color: #0000FF;">end</span>
<span style="color: #0000FF;">end</span></pre></div></div>

</p>
<p>
Здесь рассмотрение стоящих рядом точек идет только в одном направлении, сдвигаясь вправо по столбам.
</p>
<p>
<img src="http://job-interview.ru/img/segmentation/10.png" align="center" border="0">
</p>
<p>
Применение этого метода к уже частично обработанному изображению приближает нас к цели. Конечно, тут не получен идеальный вариант, но был рассмотрен <em>математический аппарат</em> для выделения областей со схожими характеристиками пикселей.
</p>
<p>
Следующим улучшением может быть создание более <em>интеллектуальной системы</em>, которая на основании некоторых изображений создает базу коэффициентов для отбора пикселей. Такие системы называются обучающимися.
</p>
<p>
Теперь рассмотрим реализацию этого примера на <em>языках программирования высокого уровня</em>.
</p>
<p>
В <em>.NET</em> существует класс Bitmap. Данный класс предоставляет большие возможности для <strong>обработки изображений</strong>.
</p>
<p>
Данный класс, также как и <strong>Matlab</strong>, представляет изображение в виде массива пикселей. Есть лишь одно отличие &#8211; вместо размерности матрицы три, в классе <strong>Bitmap</strong> представляется изображение в виде матрицы размерностью четыре.
</p>
<p>
Применим ту же фильтрацию, что и для Matlab, сделав только одно усовершенствование. Построим для каждого цвета что-то вроде <strong>гистограммы</strong>, но только будем объединять рядом стоящие значения пикселей. В нашем случае расстояние между схожими пикселями будет равно 4.
</p>
<p>
<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">public</span> <span style="color: #0600FF;">void</span> FindMean<span style="color: #000000;">&#40;</span>BitmapIm, intlength, charcanal<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
  <span style="color: #FF0000;">int</span> middlepixel <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span>
  middlepixel<span style="color: #008000;">=</span>Im.<span style="color: #0000FF;">GetPixel</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">460</span>,<span style="color: #FF0000;">256</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">G</span><span style="color: #008000;">;</span>
  <span style="color: #FF0000;">int</span> count <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span>
  <span style="color: #FF0000;">int</span> countofcolor<span style="color: #008000;">=</span><span style="color: #FF0000;">0</span><span style="color: #008000;">;</span>
  countofcolor<span style="color: #008000;">=</span>Math.<span style="color: #0000FF;">Abs</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">256</span><span style="color: #008000;">/</span>length<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
  mas_color<span style="color: #008000;">=</span><span style="color: #008000;">new</span> <span style="color: #FF0000;">int</span><span style="color: #000000;">&#91;</span>countofcolor<span style="color: #000000;">&#93;</span><span style="color: #008000;">;</span>
&nbsp;
  <span style="color: #0600FF;">for</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> i <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span> i<span style="color: #008000;">&lt;</span>countofcolor<span style="color: #008000;">;</span> i<span style="color: #008000;">++</span><span style="color: #000000;">&#41;</span>
    mas_color<span style="color: #000000;">&#91;</span>i<span style="color: #000000;">&#93;</span> <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span>
&nbsp;
  <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>canal<span style="color: #008000;">==</span><span style="color: #666666;">'B'</span><span style="color: #000000;">&#41;</span>
  <span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">for</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> i <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span> i<span style="color: #008000;">&lt;</span>Im.<span style="color: #0000FF;">Width</span><span style="color: #008000;">;</span> i<span style="color: #008000;">++</span><span style="color: #000000;">&#41;</span>
      <span style="color: #0600FF;">for</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> j <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span> j <span style="color: #008000;">&lt;</span>Im.<span style="color: #0000FF;">Height</span><span style="color: #008000;">;</span> j<span style="color: #008000;">++</span><span style="color: #000000;">&#41;</span>
	<span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>Im.<span style="color: #0000FF;">GetPixel</span><span style="color: #000000;">&#40;</span>i,j<span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">B</span><span style="color: #008000;">!=</span>Color.<span style="color: #0000FF;">Black</span>.<span style="color: #0000FF;">B</span><span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
	  mas_color<span style="color: #000000;">&#91;</span>Math.<span style="color: #0000FF;">Abs</span><span style="color: #000000;">&#40;</span>Im.<span style="color: #0000FF;">GetPixel</span><span style="color: #000000;">&#40;</span>i, j<span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">B</span> <span style="color: #008000;">/</span> length<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span><span style="color: #008000;">++;</span>
	  count<span style="color: #008000;">++;</span>
	<span style="color: #000000;">&#125;</span>
  <span style="color: #000000;">&#125;</span>
&nbsp;
  <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>canal <span style="color: #008000;">==</span> <span style="color: #666666;">'G'</span><span style="color: #000000;">&#41;</span>
  <span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">for</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> i <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span> i<span style="color: #008000;">&lt;</span>Im.<span style="color: #0000FF;">Width</span><span style="color: #008000;">;</span> i<span style="color: #008000;">++</span><span style="color: #000000;">&#41;</span>
      <span style="color: #0600FF;">for</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> j <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span> j <span style="color: #008000;">&lt;</span>Im.<span style="color: #0000FF;">Height</span><span style="color: #008000;">;</span> j<span style="color: #008000;">++</span><span style="color: #000000;">&#41;</span>
	<span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>Im.<span style="color: #0000FF;">GetPixel</span><span style="color: #000000;">&#40;</span>i, j<span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">G</span> <span style="color: #008000;">!=</span> Color.<span style="color: #0000FF;">Black</span>.<span style="color: #0000FF;">G</span><span style="color: #000000;">&#41;</span>
	<span style="color: #000000;">&#123;</span>
	  mas_color<span style="color: #000000;">&#91;</span>Math.<span style="color: #0000FF;">Abs</span><span style="color: #000000;">&#40;</span>Im.<span style="color: #0000FF;">GetPixel</span><span style="color: #000000;">&#40;</span>i, j<span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">G</span> <span style="color: #008000;">/</span> length<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span><span style="color: #008000;">++;</span>
	  count<span style="color: #008000;">++;</span>
	<span style="color: #000000;">&#125;</span>
  <span style="color: #000000;">&#125;</span>
&nbsp;
  <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>canal <span style="color: #008000;">==</span> <span style="color: #666666;">'R'</span><span style="color: #000000;">&#41;</span>
  <span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">for</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> i <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span> i<span style="color: #008000;">&lt;</span>Im.<span style="color: #0000FF;">Width</span><span style="color: #008000;">;</span> i<span style="color: #008000;">++</span><span style="color: #000000;">&#41;</span>
      <span style="color: #0600FF;">for</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> j <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span> j <span style="color: #008000;">&lt;</span>Im.<span style="color: #0000FF;">Height</span><span style="color: #008000;">;</span> j<span style="color: #008000;">++</span><span style="color: #000000;">&#41;</span>
	<span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>Im.<span style="color: #0000FF;">GetPixel</span><span style="color: #000000;">&#40;</span>i, j<span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">R</span> <span style="color: #008000;">!=</span> Color.<span style="color: #0000FF;">Black</span>.<span style="color: #0000FF;">R</span><span style="color: #000000;">&#41;</span>
	<span style="color: #000000;">&#123;</span>
	  mas_color<span style="color: #000000;">&#91;</span>Math.<span style="color: #0000FF;">Abs</span><span style="color: #000000;">&#40;</span>Im.<span style="color: #0000FF;">GetPixel</span><span style="color: #000000;">&#40;</span>i, j<span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">R</span> <span style="color: #008000;">/</span> length<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span><span style="color: #008000;">++;</span>
	  count<span style="color: #008000;">++;</span>
	<span style="color: #000000;">&#125;</span>
  <span style="color: #000000;">&#125;</span>
&nbsp;
  <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>canal <span style="color: #008000;">==</span> <span style="color: #666666;">'A'</span><span style="color: #000000;">&#41;</span>
  <span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">for</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> i <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span> i<span style="color: #008000;">&lt;</span>Im.<span style="color: #0000FF;">Width</span><span style="color: #008000;">;</span> i<span style="color: #008000;">++</span><span style="color: #000000;">&#41;</span>
      <span style="color: #0600FF;">for</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> j <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span> j <span style="color: #008000;">&lt;</span>Im.<span style="color: #0000FF;">Height</span><span style="color: #008000;">;</span> j<span style="color: #008000;">++</span><span style="color: #000000;">&#41;</span>
	<span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>Im.<span style="color: #0000FF;">GetPixel</span><span style="color: #000000;">&#40;</span>i, j<span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">A</span> <span style="color: #008000;">!=</span> Color.<span style="color: #0000FF;">Black</span>.<span style="color: #0000FF;">A</span><span style="color: #000000;">&#41;</span>
	<span style="color: #000000;">&#123;</span>
	  mas_color<span style="color: #000000;">&#91;</span>Math.<span style="color: #0000FF;">Abs</span><span style="color: #000000;">&#40;</span>Im.<span style="color: #0000FF;">GetPixel</span><span style="color: #000000;">&#40;</span>i, j<span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">A</span> <span style="color: #008000;">/</span> length<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span><span style="color: #008000;">++;</span>
	  count<span style="color: #008000;">++;</span>
	<span style="color: #000000;">&#125;</span>
  <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

</p>
<p>
Здесь происходит распределение значений пикселей по цветовым компонентам. А именно, пиксели с близко стоящими значениями объединяются в группу. Расстояние между такими группами в нашем примере равно 4. В дальнейшем, благодаря этому массиву, можно выделять значения пикселей, которых в изображении большинство.
</p>
<p>
При помощи разделения каналов было установлено, что наилучший результат получается при выделение областей из голубого канала, наихудший результат получен при выделении из зеленого.
</p>
<p>
<img src="http://job-interview.ru/img/segmentation/11.png" align="center" border="0">
</p>
<p>
Как видно, выделилась область голубого неба.
</p>
<p>
С помощью наложения некоторых фильтров, сначала голубого, а потом красного, получается следующее изображение.
</p>
<p>
<img src="http://job-interview.ru/img/segmentation/12.png" align="center" border="0">
</p>
<p>
Пример кода, для обработки голубого канала.
</p>
<p>
<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">public</span> <span style="color: #0600FF;">void</span> MarkBlue<span style="color: #000000;">&#40;</span>BitmapIm<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
  <span style="color: #FF0000;">int</span> metka <span style="color: #008000;">=</span> <span style="color: #008000;">-</span><span style="color: #FF0000;">1</span>, count <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span>, count_opposite <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span>
  <span style="color: #008080; font-style: italic;">// Color pixel = MarkIm.GetPixel(0, 0);</span>
  <span style="color: #0600FF;">for</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> i <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span> i<span style="color: #008000;">&lt;</span>Im.<span style="color: #0000FF;">Width</span><span style="color: #008000;">;</span> i<span style="color: #008000;">++</span><span style="color: #000000;">&#41;</span>
    <span style="color: #0600FF;">for</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> j <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span> j <span style="color: #008000;">&lt;</span>Im.<span style="color: #0000FF;">Height</span><span style="color: #008000;">;</span> j<span style="color: #008000;">++</span><span style="color: #000000;">&#41;</span>
      <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>Im.<span style="color: #0000FF;">GetPixel</span><span style="color: #000000;">&#40;</span>i, j<span style="color: #000000;">&#41;</span> <span style="color: #008000;">==</span> Color.<span style="color: #0000FF;">Black</span><span style="color: #000000;">&#41;</span>
	<span style="color: #008080; font-style: italic;">//    count++;</span>
&nbsp;
  count <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span>
  FindMean<span style="color: #000000;">&#40;</span>Im, <span style="color: #FF0000;">4</span>,<span style="color: #666666;">'B'</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
  <span style="color: #FF0000;">int</span> maxColor <span style="color: #008000;">=</span> mas_color<span style="color: #000000;">&#91;</span><span style="color: #FF0000;">0</span><span style="color: #000000;">&#93;</span><span style="color: #008000;">;</span>
  <span style="color: #FF0000;">int</span> maxIndex <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span>
  <span style="color: #0600FF;">for</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> i <span style="color: #008000;">=</span> <span style="color: #FF0000;">1</span><span style="color: #008000;">;</span> i<span style="color: #008000;">&lt;</span> <span style="color: #FF0000;">256</span> <span style="color: #008000;">/</span> <span style="color: #FF0000;">4</span><span style="color: #008000;">;</span> i<span style="color: #008000;">++</span><span style="color: #000000;">&#41;</span>
    <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>maxColor<span style="color: #008000;">&lt;</span>mas_color<span style="color: #000000;">&#91;</span>i<span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
      maxColor <span style="color: #008000;">=</span> mas_color<span style="color: #000000;">&#91;</span>i<span style="color: #000000;">&#93;</span><span style="color: #008000;">;</span>
      maxIndex <span style="color: #008000;">=</span> i<span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span>
&nbsp;
  <span style="color: #008080; font-style: italic;">//  MessageBox.Show(Convert.ToString(mas_color[20]));</span>
  <span style="color: #0600FF;">for</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> i <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span> i<span style="color: #008000;">&lt;</span>Im.<span style="color: #0000FF;">Width</span><span style="color: #008000;">;</span> i<span style="color: #008000;">++</span><span style="color: #000000;">&#41;</span>
    <span style="color: #0600FF;">for</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> j <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span> j <span style="color: #008000;">&lt;</span>Im.<span style="color: #0000FF;">Height</span><span style="color: #008000;">;</span> j<span style="color: #008000;">++</span><span style="color: #000000;">&#41;</span>
      <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>maxIndex<span style="color: #008000;">&gt;</span> <span style="color: #000000;">&#40;</span>Im.<span style="color: #0000FF;">GetPixel</span><span style="color: #000000;">&#40;</span>i, j<span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">B</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">/</span> <span style="color: #FF0000;">4</span><span style="color: #000000;">&#41;</span>
      <span style="color: #000000;">&#123;</span>
	<span style="color: #008080; font-style: italic;">//  count++;</span>
	Im.<span style="color: #0000FF;">SetPixel</span><span style="color: #000000;">&#40;</span>i, j, Color.<span style="color: #0000FF;">Black</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
      <span style="color: #000000;">&#125;</span>
&nbsp;
  <span style="color: #0600FF;">for</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> i <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span> i<span style="color: #008000;">&lt;</span>Im.<span style="color: #0000FF;">Width</span><span style="color: #008000;">;</span> i<span style="color: #008000;">++</span><span style="color: #000000;">&#41;</span>
    <span style="color: #0600FF;">for</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> j <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span> j <span style="color: #008000;">&lt;</span>Im.<span style="color: #0000FF;">Height</span><span style="color: #008000;">;</span> j<span style="color: #008000;">++</span><span style="color: #000000;">&#41;</span>
      <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>Im.<span style="color: #0000FF;">GetPixel</span><span style="color: #000000;">&#40;</span>i, j<span style="color: #000000;">&#41;</span> <span style="color: #008000;">==</span> Color.<span style="color: #0000FF;">Black</span><span style="color: #000000;">&#41;</span>
	count<span style="color: #008000;">++;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

</p>
<p>
Фактически, мы получили простой математический аппарат для выделения областей. Тут за основу принимается распределение пикселей по значению, геометрические и пространственные характеристики никак не учитываются.
</p>
<p>
В дальнейшем после применения фильтров для цвета пикселей, на мой взгляд, должен быть поставлен вопрос о правильном выделении пограничных контуров. Тут может возникнуть проблема, которая отображена на изображениях, приведенных выше. Что, если область принадлежит области &#8220;лошади&#8221;, но при этом цветовые характеристики совпадают с областью &#8220;неба&#8221;?
</p>
<p>
Думаю, для решения этой проблемы потребуется визуальная оценка результатов, сделанная человеком.
</p>
<p>
В общем, метод разбиения областей с помощью цветовых характеристик имеет много недостатков и в голом виде не может претендовать на законченность, однако, совершенствование и добавление новых путей решения в итоге приведет к хорошему результату.</p>
]]></content:encoded>
			<wfw:commentRss>http://job-interview.ru/articles/post/362/feed</wfw:commentRss>
		<slash:comments>22117</slash:comments>
		</item>
	</channel>
</rss>
