Сегментация по границам объекта и областям изображения с реализацией в Python

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

Сегментация 

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

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

Скрытая информация на изображениях также обнаруживается с помощью сегментации. 

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

  • значения интенсивности, такие как неоднородность (сегментация по границам);
  • сходство (сегментация по областям).  

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

Появление машинного обучения (МО) с привлечением Python намного упростило процесс сегментации. 

Применение сегментации 

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

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

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

Сегментация часто встречается и в таких областях, как робототехника. 

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

Сегментация по границам объекта 

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

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

Источник: ResearchGate

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

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

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

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

Источник: ResearchGate

Основные сферы применения сегментации 

  • Обнаружение тяжелых заболеваний.
  • Система распознавания лиц.
  • Беспилотные автомобили.
  • Робототехника. 

Реализация Python 

import numpy as np
import matplotlib.pyplot as plt
from skimage import data
coins = data.coins()
hist = np.histogram(coins, bins=np.arange(0, 256))
fig, (ax1) = plt.subplots()
ax1.imshow(coins, cmap=plt.cm.gray,interpolation='nearest')
Фото автора

Сегментация по границам объекта 

from skimage.feature import canny
edges = canny(coins/255.)
fig, ax = plt.subplots(figsize=(4, 3))
ax.imshow(edges, cmap=plt.cm.gray, interpolation='nearest')
ax.axis('off')
ax.set_title('Canny detector')
Text(0.5, 1.0, 'Canny detector')

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

Фото автора 

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

from scipy import ndimage as ndi
fill_coins = ndi.binary_fill_holes(edges)
fig, ax = plt.subplots(figsize=(4, 3))
ax.imshow(fill_coins, cmap=plt.cm.gray, interpolation='nearest')
ax.axis('off')
ax.set_title('Filling the holes')
Text(0.5, 1.0, 'Filling the holes')

Задействуем инструкцию ndimage as ndi, что означает n-мерное изображение, операциями обработки которого, будь то ввод, вывод, обрезка, фильтрация и т.д., занимается подмодуль. 

Ndi.binary_fill_holes предназначен для заполнения пробелов в n-мерных бинарных массивах, а также и пограничных пробелов.

Фото автора

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

from skimage.filters import sobel
elevation_map = sobel(coins)
fig, ax = plt.subplots(figsize=(4, 3))
ax.imshow(elevation_map, cmap=plt.cm.gray, interpolation='nearest')
ax.axis('off')
ax.set_title('elevation_map')
Text(0.5, 1.0, 'elevation_map')

Здесь мы импортируем модуль sobel из skimage.filters для поиска границ на входном изображении. 

Sobel transform также способствует поиску вертикальных и горизонтальных границ на входном изображении. 

Фото автора

Заключение

Итак, мы подробно рассмотрели понятие сегментации и два ее важных метода (по границам объектов изображения и его областям) с реализациями Python. 

Надеемся, статья была вам полезна.

Читайте также:

Читайте нас в TelegramVK и Яндекс.Дзен


Перевод статьи Amit Chauhan: Edge-Based and Region-Based Segmentation Using Python

Предыдущая статьяТестируя нетестируемое — битва с легаси-кодом
Следующая статья8 рекомендаций по написанию читаемого кода на C# с помощью .NET 6