DevGang
Авторизоваться

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

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

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

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

Блок-схема

[Read Image]
    |
    V
[Convert to Grayscale]
    |
    V
[Select Global Threshold]
    |
    V
[Apply Threshold Segmentation]
    |
    V
[Output Segmentation Result]

Анализ алгоритма пороговой сегментации

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

Конкретные алгоритмы:

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

Реализация кода (пример Python)

import cv2
import numpy as np

# Read the image
image = cv2.imread('image.jpg', 0)

# Apply global threshold
_, thresh = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)

# Display the image
cv2.imshow('Thresholded Image', thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()

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

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

Блок-схема

[Read Image]
    |
    V
[Select Seed Points]
    |
    V
[Initialize List of Growth Points]
    |
    V
[Region Growing Iteration]
    |
    V
[Add New Growth Points if Criteria Met]
    |
    V
[Update Region Characteristics]
    |
    V
[Output Segmentation Result]

Анализ алгоритмов сегментации по регионам

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

Конкретные алгоритмы:

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

Реализация кода (пример Python)

import cv2
import numpy as np

def region_growing(img, seed):
    neighbors = [(0, 1), (1, 0), (-1, 0), (0, -1)]  # 4-connectivity
    region_threshold = 10
    region_size = 1
    region_mean = float(img[seed])

    # Initialize the list of growth points
    growth_points = [seed]

    # Mark array to indicate whether a pixel has been segmented
    segmented = np.zeros_like(img, dtype=np.bool)

    while len(growth_points) > 0:
        new_points = []
        for point in growth_points:
            for neighbor in neighbors:
                # Calculate the position of neighboring pixel
                x_new = point[0] + neighbor[0]
                y_new = point[1] + neighbor[1]

                # Check if the neighboring pixel is outside the image boundaries
                if x_new < 0 or y_new < 0 or x_new >= img.shape[0] or y_new >= img.shape[1]:
                    continue

                # Check if the neighboring pixel has already been segmented
                if segmented[x_new, y_new]:
                    continue

                pixel_value = img[x_new, y_new]
                if abs(pixel_value - region_mean) < region_threshold:
                    segmented[x_new, y_new] = True
                    region_size += 1
                    region_mean = (region_mean * (region_size - 1) + pixel_value) / region_size
                    new_points.append((x_new, y_new))
        growth_points = new_points

    return segmented

# Read the image
image = cv2.imread('image.jpg', 0)

# Set the seed point
seed_point = (100, 100)

# Apply the region growing algorithm
segmented_image = region_growing(image, seed_point)

# Display the image
cv2.imshow('Segmented Image', segmented_image.astype(np.uint8) * 255)
cv2.waitKey(0)
cv2.destroyAllWindows()

Сегментация обнаружения краев

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

Блок-схема

[Read Image]
    |
    V
[Convert to Grayscale]
    |
    V
[Apply Gaussian Blur]
    |
    V
[Compute Gradient and Direction]
    |
    V
[Non-Maximum Suppression]
    |
    V
[Double Threshold Detection and Edge Linking]
    |
    V
[Output Edge Detection Result]

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

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

Конкретные алгоритмы

  • Оператор Sobel: обнаруживает края путем аппроксимации градиента изображения в горизонтальном и вертикальном направлениях путем расчета производных первого порядка.
  • Canny Edge Detection: многоэтапный алгоритм обнаружения границ, который включает фильтрацию по Гауссу, расчет градиента, подавление немаксимальных значений и связывание краев с двойным порогом. Алгоритм Канни направлен на поиск оптимального результата обнаружения границ, что означает, что края четкие и точно расположены.
  • Оператор Laplacian: обнаруживает края путем вычисления производных второго порядка изображения, при этом края соответствуют точкам пересечения нуля.

Реализация кода (пример Python)

import cv2
import numpy as np

# Read the image
image = cv2.imread('image.jpg', 0)

# Perform edge detection using the Canny algorithm
edges = cv2.Canny(image, 100, 200)

# Display the image
cv2.imshow('Edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

Сегментация на основе графов

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

Блок-схема

[Read Image]
    |
    V
[Initialize Graph Cut Model]
    |
    V
[Construct Graph Nodes and Edges]
    |
    V
[Define Energy Function]
    |
    V
[Minimize Energy Function]
    |
    V
[Output Segmentation Result]

Анализ алгоритмов сегментации на основе графов

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

Конкретные алгоритмы

  • Разрез графика: определена энергетическая функция, включая член данных и член гладкости. Термин данных измеряет совместимость пикселей с определенной меткой, а термин сглаживания побуждает соседние пиксели иметь одну и ту же метку. Минимизируя функцию энергии, изображение можно сегментировать на несколько областей.
  • GrabCut: расширение Graph Cut, где пользователю нужно лишь грубо указать передний план и фон, а алгоритм автоматически выполняет итерации для оптимизации и достижения более точного результата сегментации.
  • Нормализованный разрез: основанный на концепции вырезания графика, он учитывает глобальную информацию о графике. Оптимизируя критерий нормализованного разреза, он гарантирует, что сегментированные подмножества тесно связаны внутри и слабо связаны снаружи.

Реализация кода (пример Python)

import cv2
import numpy as np
from skimage import segmentation

# Read the image
image = cv2.imread('image.jpg')

# Apply graph cut algorithm
labels = segmentation.slic(image, compactness=30, n_segments=400)
segmented_image = segmentation.mark_boundaries(image, labels)

# Display the image
cv2.imshow('Segmented Image', segmented_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

Рекомендации по инструменту

Недавно я обнаружил инструмент под названием Codia AI Design. Он может не только идеально восстанавливать изображения в черновиках дизайна Figma, но также превосходно нарезать дизайны, позволяя вам получать доступ к нужным изображениям и текстовым ресурсам в любое время и в любом месте. Опыт показан на следующем изображении:

Источник:

#Design
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

В этом месте могла бы быть ваша реклама

Разместить рекламу