Искусство обработки изображений: освоение передовых методов сегментации элементов изображения
Сегментация элементов изображения — это фундаментальный и важный метод обработки изображений, включающий отделение целей или областей интереса от изображения. В этой статье будет представлено подробное введение в несколько распространенных методов сегментации элементов изображения, а также соответствующие реализации кода, блок-схемы и анализ алгоритмов.
Пороговая сегментация
Пороговая сегментация — один из самых простых и часто используемых методов сегментации изображений. Он основан на значениях оттенков серого изображения и сегментирует изображение на передний план и фон, устанавливая один или несколько пороговых значений. Порог может быть глобальным или локальным (адаптивный порог). Глобальная пороговая сегментация подходит для изображений с высоким контрастом между передним планом и фоном, тогда как адаптивная пороговая сегментация может справляться с неравномерной яркостью изображений.
Блок-схема
[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, но также превосходно нарезать дизайны, позволяя вам получать доступ к нужным изображениям и текстовым ресурсам в любое время и в любом месте. Опыт показан на следующем изображении: