что такое сегментация изображения
Сегментация изображений
Сегментация изображения — задача поиска групп пикселей, каждая из которых характеризует один смысловой объект. В статистике эта проблема известна как кластерный анализ и является широко изученной областью с сотнями различных алгоритмов. В компьютерном зрении сегментация изображения является одной из старейших и широко изучаемых проблем.
В более ранних техниках используется расщепление и слияние регионов, что соответствует разделительным и агломерационным алгоритмам в литературе по кластеризации. Современные алгоритмы чаще оптимизируют некоторые глобальные критерии, такие как внутрирегиональная согласованность и межрегиональные длины границ.
Ниже будут рассмотрены два алгоритма — графо-ориентированная сегментация и метод нормализованных срезов. Первый из них является базовым алгоритмом сегментации, который прост и понятен в реализации, но медленный и результаты недостаточно хороши. Второй алгоритм является продвинутой версией первого со множеством эвристик. Что отражается, как на производительности, так и на результатах.
Содержание
Графо-ориентированная сегментация (англ. Graph-based segmentation) [ править ]
Для любого региона R, его внутренняя разница определяется как наибольшая мера отличия в минимальном остовном дереве региона,
Для любых двух соседних областей, по крайней мере, с одним смежным ребром, соединяющим их вершины, разность между этими регионами определяется как ребро минимального веса, соединяющее эти два региона,
Алгоритм объединяет любые две соседние области, разница которых меньше минимальной внутренней разности этих двух областей,
[math]MInt(R_1, R_2) = \min(Int(R_1) + \tau(R_1), Int(R_2) +\tau(R_2)),[/math]
На рисунке слева — исходное изображение, справа — сегментированное после применения данного алгоритма.
Метод нормализованных срезов (англ. Normalized cuts) [ править ]
Mетод нормализованных срезов, исследует сходство между соседними пикселями и пытается разделить их на группы, которые в свою очередь связаны слабо. Рассмотрим простой пример.
Все пиксели в группе A имеют высокое сходство, показанное в виде толстых красных линий, как и пиксели в группе B. Соединения между этими двумя группами, показанные в виде более тонких синих линий, намного слабее. Нормализованный разрез между двумя группами, показанный пунктирной линией, разделяет их на два кластера.
Разрез между двумя группами A и B определяется как сумма всех взвешенных весов,
где веса между двумя пикселями [math]i[/math] и [math]j[/math] соответствуют их сходству. Однако использование минимального среза в качестве критерия сегментации не приводит к разумным кластерам, поскольку наименьшие срезы обычно предусматривают выделение одного пикселя.
Лучшей мерой сегментации является нормализованный срез, который определяется как
обычно [math]\phi = 0.2.[/math] Данный рисунок схематично показывает этот процесс.
Так как количество вершин графа на втором изображении велико и работать с каждым из них чрезвычайно дорого, необходимо выделить подмножество вершин-предводителей для каждого из подмножеств и далее работать уже с ними. Мы начнем с выбора примерно половины пикселей в качестве представителей, которые назовем начальными числами: они выбираются таким образом, чтобы каждый пиксель в исходном изображении был сильно связан по крайней мере с одним соседним с ним начальным числом (см. третье изображение). Далее процесс продолжается рекурсивно (см. четвертое изображение), количество вершин на каждом новом более грубом уровне уменьшается. Значения узлов более нижнего уровня вычисляются путем интерполяции родительских значений и сопоставления значений [math] \epsilon = 0,1[/math] в пределах от 0 и 1 до Boolean значений. Выраженные сегменты появляются на соответствующем уровне как узлы, которые слабо связаны со своими соседями. Следовательно, задача минимизации упрощается до поиска вершин-предводителей на всех уровнях.
Результат работы данного алгоритма:
Свёрточные нейронные сети [ править ]
Модель U-Net, разработанная авторами для сегментации биомедицинских изображений, улучшает архитектуру FCN путём использования сужающихся блоков свёртки для захвата контекста, расширяющихся блоков свёртки для локализации, а также прямых связей между блоками свёртки на одинаковых уровнях. Прямая связь слоёв обеспечивает улучшенное обучение за счёт отсутствия так называемого «артефакта шахматной доски» — негативного явления, вызванного апсэмплингом при помощи транспонированной свёртки. Развитием U-Net, в свою очередь модель DenseNet, в которой используются полностью связанные свёрточные сети. В основе идеи лежит использование «плотных блоков» — совокупности нескольких свёрточных слоёв с подключением каждого слоя к каждому слою. Однако, существенным недостатком такой модели является низкая эффективность работы с памятью.
Совершенно по-иному на свёртку для сегментации объектов позволил взглянуть метод расширенных свёрток (англ. atrous convolutions), применяющийся в современных state-of-the-art подходах (DeepLab, DeepLab v3, DeepLab v3+). Расширенная свёртка заключается в том, чтобы применять свёртки с ядрами разного размера и разным страйдом над прямоугольниками с одним и тем же центром, а впоследствии комбинировать полученные таким образом признаки. Расширенные свёртки могут применяться как каскадно (последовательно регулируя показатель расширения фильтра), так и параллельно (англ. ASPP, Atrous Spatial Pyramid Pooling — применяя свёртки с различным масштабом ядер на одном и том же слое свёрточной сети с пулингом в конце). Такой подход позволил достичь лучших результатов в изображениях с объектами разных масштабов.
Обзор алгоритмов сегментации
Алгоритм сегментации по водоразделам (WaterShed)
Алгоритм работает с изображением как с функцией от двух переменных f=I(x,y), где x,y – координаты пикселя:
Значением функции может быть интенсивность или модуль градиента. Для наибольшего контраста можно взять градиент от изображения. Если по оси OZ откладывать абсолютное значение градиента, то в местах перепада интенсивности образуются хребты, а в однородных регионах – равнины. После нахождения минимумов функции f, идет процесс заполнения “водой”, который начинается с глобального минимума. Как только уровень воды достигает значения очередного локального минимума, начинается его заполнение водой. Когда два региона начинают сливаться, строится перегородка, чтобы предотвратить объединение областей [2]. Вода продолжит подниматься до тех пор, пока регионы не будут отделяться только искусственно построенными перегородками (рис.1).
Рис.1. Иллюстрация процесса заполнения водой
Такой алгоритм может быть полезным, если на изображении небольшое число локальных минимумов, в случае же их большого количества возникает избыточное разбиение на сегменты. Например, если непосредственно применить алгоритм к рис. 2, получим много мелких деталей рис. 3.
Рис. 2. Исходное изображение
Рис. 3. Изображение после сегментации алгоритмом WaterShed
Чтобы избавиться от избытка мелких деталей, можно задать области, которые будут привязаны к ближайшим минимумам. Перегородка будет строиться только в том случае, если происходит объединение двух регионов с маркерами, в противном случае будет происходить слияние этих сегментов. Такой подход убирает эффект избыточной сегментации, но требует предварительной обработки изображения для выделения маркеров, которые можно обозначить интерактивно на изображении рис. 4, 5.
Рис. 4. Изображение с маркерами
Рис. 5. Изображение после сегментации алгоритмом WaterShed с использованием маркеров
Рис. 6. В качестве маркеров использовались контуры, имеющие длину выше определенного порога
В результате работы алгоритма мы получаем маску с сегментированным изображением, где пиксели одного сегмента помечены одинаковой меткой и образуют связную область. Основным недостатком данного алгоритма является использование процедуры предварительной обработки для картинок с большим количеством локальных минимумов (изображения со сложной текстурой и с обилием различных цветов).
Алгоритм сегментации MeanShift
MeanShift группирует объекты с близкими признаками. Пиксели со схожими признаками объединяются в один сегмент, на выходе получаем изображение с однородными областями.
Например, в качестве координат в пространстве признаков можно выбрать координаты пикселя (x, y) и компоненты RGB пикселя. Изобразив пиксели в пространстве признаков, можно заметить сгущения в определенных местах.
Рис. 7. (a) Пиксели в двухмерном пространстве признаков. (b) Пиксели, пришедшие в один локальный максимум, окрашены в один цвет. (с) — функция плотности, максимумы соответствуют местам наибольшей концентрации пикселей. Рисунок взят из статьи [3].
Чтобы легче было описывать сгущения точек, вводится функция плотности:
– вектор признаков i-ого пикселя, d — количество признаков, N — число пикселей, h — параметр, отвечающий за гладкость,
— ядро. Максимумы функции
расположены в точках сгущения пикселей изображения в пространстве признаков. Пиксели, принадлежащие одному локальному максимуму, объединяются в один сегмент. Получается, чтобы найти к какому из центров сгущения относится пиксель, надо шагать по градиенту
для нахождения ближайшего локального максимума.
При выборе в качестве признаков координат пикселей и интенсивностей по цветам в один сегмент будут объединяться пиксели с близкими цветами и расположенные недалеко друг от друга. Соответственно, если выбрать другой вектор признаков, то объединение пикселей в сегменты уже будет идти по нему. Например, если убрать из признаков координаты, то небо и озеро будут считаться одним сегментом, так как пиксели этих объектов в пространстве признаков попали бы в один локальный максимум.
Если объект, который хотим выделить, состоит из областей, сильно различающихся по цвету, то MeanShift не сможет объединить эти регионы в один, и наш объект будет состоять из нескольких сегментов. Но зато хорошо справиться с однородным по цвету предметом на пестром фоне. Ещё MeanShift используют при реализации алгоритма слежения за движущимися объектами [5].
Результат:
Рис. 8. Исходное изображение
Рис. 9. После сегментации алгоритмом MeanShift
Алгоритм сегментации FloodFill
С помощью FloodFill (заливка или метод «наводнения») можно выделить однородные по цвету регионы. Для этого нужно выбрать начальный пиксель и задать интервал изменения цвета соседних пикселей относительно исходного. Интервал может быть и несимметричным. Алгоритм будет объединять пиксели в один сегмент (заливая их одним цветом), если они попадают в указанный диапазон. На выходе будет сегмент, залитый определенным цветом, и его площадь в пикселях.
Такой алгоритм может быть полезен для заливки области со слабыми перепадами цвета однородным фоном. Одним из вариантов использования FloodFill может быть выявление поврежденных краев объекта. Например, если, заливая однородные области определенным цветом, алгоритм заполнит и соседние регионы, то значит нарушена целостность границы между этими областями. Ниже на изображении можно заметить, что целостность границ заливаемых областей сохраняется:
Рис. 10, 11. Исходное изображение и результат после заливки нескольких областей
А на следующих картинках показан вариант работы FloodFill в случае повреждения одной из границ в предыдущем изображении.
Рис. 12, 13. Иллюстрация работы FloodFill при нарушение целостности границы между заливаемыми областями
Алгоритм сегментации GrabCut
Это интерактивный алгоритм выделения объекта, разрабатывался как более удобная альтернатива магнитному лассо (чтобы выделить объект, пользователю требовалось обвести его контур с помощью мыши). Для работы алгоритма достаточно заключить объект вместе с частью фона в прямоугольник (grab). Сегментирование объекта произойдет автоматически (cut).
Могут возникнуть сложности при сегментации, если внутри ограничивающего прямоугольника присутствуют цвета, которые встречаются в большом количестве не только в объекте, но и на фоне. В этом случае можно поставить дополнительные метки объекта (красная линия) и фона (синяя линия).
Рассмотрим идею алгоритма. За основу взят алгоритм интерактивной сегментации GraphCut, где пользователю надо поставить маркеры на фон и на объект. Изображение рассматривается как массив . Z — значения интенсивности пикселей, N-общее число пикселей. Для отделения объекта от фона алгоритм определяет значения элементов массива прозрачности
, причем
может принимать два значения, если
= 0, значит пиксель принадлежит фону, если
= 1, то объекту. Внутренний параметр
содержит гистограмму распределения интенсивности переднего плана и гистограмму фона:
.
Задача сегментации — найти неизвестные . Рассматривается функция энергии:
Причем минимум энергии соответствует наилучшей сегментации.
V (a, z) — слагаемое отвечает за связь между пикселями. Сумма идет по всем парам пикселей, которые являются соседями, dis(m,n) — евклидово расстояние. отвечает за участие пар пикселей в сумме, если a n = a m, то эта пара не будет учитываться.
— отвечает за качество сегментации, т.е. разделение объекта от фона.
Найдя глобальный минимум функции энергии E, получим массив прозрачности . Для минимизации функции энергии, изображение описывается как граф и ищется минимальный разрез графа. В отличие от GraphCut в алгоритме GrabCut пиксели рассматриваются в RGB пространстве, поэтому для описания цветовой статистики используют смесь гауссиан (Gaussian Mixture Model — GMM). Работу алгоритма GrabCut можно посмотреть, запустив сэмпл OpenCV grabcut.cpp.
Мы рассмотрели только небольшую часть существующих алгоритмов. В результате сегментации на изображении выделяются области, в которые объединяются пиксели по выбранным признакам. Для заливки однородных по цвету объектов подойдет FloodFill. С задачей отделения конкретного объекта от фона хорошо справится GrabCut. Если использовать реализацию MeanShift из OpenCV, то пиксели, близкие по цвету и координатам, будут кластеризованы. WaterShed подойдет для изображений с простой текстурой. Таким образом, алгоритм сегментации следует выбирать, конечно, исходя из конкретной задачи.
Обзор методов сегментации изображений в библиотеке scikit-image
Thresholding
Это самый простой способ отделить объекты от фона, выбрав пиксели выше или ниже определенного порога. Это обычно полезно, когда мы собираемся сегментировать объекты по их фону. Вы можете прочитать больше о пороге здесь.
Люди, знакомы с фильмом «Терминатор», наверняка согласятся, что это был величайший научно-фантастический фильм той эпохи. В фильме Джеймс Кэмерон представил интересную концепцию визуальных эффектов, которая позволила зрителям скрыться за глазами киборга под названием Терминатор. Этот эффект стал известен как «Терминаторное видение» (англ. Terminator Vision). В некотором смысле, он отделял силуэты людей от фона. Тогда это могло звучать совершенно неуместно, но сегментация изображений сегодня является важной частью многих методов обработки изображений.
Сегментация изображения
Имеются ряд библиотек, написанных для анализа изображений. В этой статье мы подробно обсудим scikit-image, библиотеку обработки изображений на среде Python.
Scikit-image
Scikit-image — это библиотека Python, предназначенная для обработки изображений.
Установка
scikit-image устанавливается следующим образом:
Обзор изображений в Python
Прежде чем приступить к техническим аспектам сегментации изображений, важно немного ознакомиться с экосистемой изображений Scikit и с тем, как она обрабатывает изображения.
Импорт GrayScale Image из библиотеки skimage
Модуль данных skimage содержит несколько встроенных примеров наборов данных, которые обычно хранятся в формате jpeg или png.
Импорт цветного изображения из библиотеки skimage
Импорт изображения из внешнего источника
Загрузка нескольких изображений
Сохранение изображений
Сегментация изображения
Теперь, когда у нас есть представление о scikit-image, предлагаем рассмотреть детали сегментации изображений. Сегментация изображения – это процесс разделения цифрового изображения на несколько сегментов, чтобы упростить и / или изменить представление изображения на что-то более значимое и более простое для анализа.
В этой статье мы рассмотрим алгоритмы для моделей обучаемые как с учителем (supervised) так и без учителя (unsupervised).
Некоторые из алгоритмов сегментации доступны в библиотеке scikit-image
Сегментация с учителем: некоторые предварительные знания, возможно, из человеческого ввода, используются для руководства алгоритмом.
Сегментация без учителем: предварительных знаний не требуется. Эти алгоритмы пытаются автоматически разделить изображения на значимые области. Пользователь по-прежнему может настраивать определенные параметры для получения желаемых результатов.
Давайте попробуем это на изображении учебника, который поставляется с предустановленным набором данных scikit-image.
Обычный импорт
Простая функция для построения изображений
Образ
Это изображение немного темнее, но, возможно, мы все же сможем выбрать значение, которое даст нам разумную сегментацию без каких-либо сложных алгоритмов. Теперь, чтобы помочь нам в выборе этого значения, мы будем использовать гистограмму.
В данном случае гистограмма показывает количество пикселей в изображении с различными значениями интенсивности, найденными в этом изображении. Проще говоря, гистограмма — это график, на котором ось X показывает все значения, которые есть на изображении, а ось Y показывает частоту этих значений.
Наш пример оказался 8-битным изображением, поэтому мы имеем 256 возможных значений по оси X. По гистограмме видно, что существует концентрация довольно светлых пикселей (0: черный, 255: белый). Скорее всего, это наш довольно светлый текстовый фон, но остальное немного размыто. Идеальная гистограмма сегментации была бы бимодальной, чтобы мы могли выбрать число прямо посередине. Теперь давайте попробуем создать несколько сегментированных изображений на основе простого порогового значения.
Контролируемый порог
Поскольку мы сами выбираем значение порогового значения, мы называем это контролируемым пороговым значением.
Слева: текст> 50 | Середина: текст> 70 | Справа: текст> 120
Мы не получили идеальных результатов, так как тень слева создает проблемы. Давайте попробуем с порогом без присмотра сейчас.
Неконтролируемый порог
Неконтролируемый порог Scikit-image имеет ряд автоматических методов определения порога, которые не требуют ввода при выборе оптимального порога. Вот некоторые из методов: otsu, li, local.
Слева otsu || Справа: li
В случае local, нам также нужно указать block_size. Offset помогает настроить изображение для лучших результатов.
Данный метод дает довольно хороший эффект. В значительной степени можно измевиться от шумных регионов.
Сегментация с алгоритмом для модели с учителем
Thresholding — это очень простой процесс сегментации, и он не будет работать должным образом на высококонтрастном изображении, для которого нам понадобятся более совершенные инструменты.
В этом разделе мы будем использовать пример изображения, которое свободно доступно, и попытаемся сегментировать головную часть, используя методы с учителем.
Прежде чем делать какую-либо сегментацию изображения, рекомендуется удалить из нее шум с помощью некоторых фильтров.
Однако в нашем случае изображение не имеет значительных шумов, поэтому мы примем его как есть. Следующим шагом будет преобразование изображения в оттенки серого с помощью rgb2gray.
Мы будем использовать два метода сегментации, которые работают на совершенно разных принципах.
Активная контурная сегментация (англ. Active contour segmentation)
Сегментация активного контура также называется змеей и инициализируется с использованием определенного пользователем контура или линии вокруг интересующей области, а затем этот контур медленно сжимается и притягивается или отталкивается от света и краев.
Для нашего примера изображения давайте нарисуем круг вокруг головы человека, чтобы инициализировать змею.
Вышеприведенные вычисления вычисляют координаты x и y точек на периферии круга. Так как мы дали разрешение 200, оно вычислит 200 таких точек.
Затем алгоритм сегментирует лицо человека от остальной части изображения, подгоняя замкнутую кривую к краям лица.
Мы можем настроить параметры, называемые alpha и beta. Более высокие значения alpha заставляют кривую сокращаться быстрее, в то время как beta делает кривую более гладкой.
Сегментация случайного прохождения (англ. Random walker segmentation)
В этом методе сегментации проводится с помощью интерактивной маркировкой, которые называются метками (англ. labels). Рисуя каждый пиксель метке, для которой рассчитывается наибольшая вероятность, можно получить высококачественную сегментацию изображения. Подробнее этим методом можно ознакомиться в этой работе.
Далее мы будем снова использовать предыдущие значения из нашего примера. Мы могли бы иметь делали разные инициализации, но для простоты давайте придерживаться принципа кругов.
Алгоритм случайного прохождения принимать метки в качестве ввода. Таким образом, у нас будет большой круг, охватывающий все лицо человека, и еще один меньший круг около середины лица.
Теперь давайте использовать Random Walker и посмотрим, что произойдет.
Результат не самый хороший, остались неохваченными края лица. Чтобы исправить эту ситуацию, мы можем настроить параметр прохождения, пока не получим желаемый результат. После нескольких попыток мы установили значение 3000, который работает достаточно хорошо.
Это все для сегментации с учителем, где мы должны были предоставить определенные входные данные, а также настроить некоторые параметры. Тем не менее, не всегда возможно, чтобы человек смотрел на изображение и затем решал, какой вклад дать и с чего начать. К счастью, для таких ситуаций у нас есть неконтролируемые методы сегментации.
Сегментация без учителя
Сегментация без учителя не требует предварительных знаний. Рассмотрим изображение, которое настолько велико, что невозможно рассмотреть все пиксели одновременно. Таким образом, в таких случаях сегментация без учителя может разбить изображение на несколько субрегионов, поэтому вместо миллионов пикселей у вас есть десятки или сотни областей. Давайте посмотрим на два таких алгоритма:
Простая Линейно-итеративная Кластеризация
Метод ( англ. Simple Linear Iterative Clustering или SLIC) использует алгоритм машинного обучения под названием K-Means. Он принимает все значения пикселей изображения и пытается разделить их на заданное количество подобластей. Прочитайте эту работу для подробной инфомации.
SLIC работает с разными цветами, поэтому мы будем использовать исходное изображение.
Все, что мы нужно сделать, это просто установить для каждого найденного нами сегмента среднее значение, что делает его больше похожим на изображение.
Мы сократили это изображение с 512 * 512 = 262 000 пикселей до 155 сегментов.
Felzenszwalb
Этот метод также использует алгоритм машинного обучения, называемый кластеризацией минимально охватывающего дерева (англ. minimum-spanning tree clustering). Felzenszwaib не сообщает нам точное количество кластеров, на которые будет разделено изображение. Он будет генерировать столько кластеров, сколько он считает нужным для этого.
На рисунке слишком много регионов. Давайте подсчитаем количество уникальных сегментов.
Теперь давайте перекрасим их, используя среднее значение по сегменту, как мы это делали в алгоритме SLIC.
Теперь мы получаем меньше количество сегментов. Если бы мы хотели еще меньше сегментов, мы могли бы изменить параметр scale. Этот подход иногда называют избыточной сегментацией (англ. over-segmentation).
Это больше похоже на постеризованное изображение, которое по сути является лишь уменьшением количества цветов. Чтобы объединить их снова (RAG).