Сохранить отдельные сегменты из сегментации изображения - PullRequest
2 голосов
/ 17 мая 2019

Я использую модули skimage.segmentation для поиска смежных сегментов в изображении.Например,

this image

сегментов довольно приятно до

segmented

Я хочу иметь возможность просматривать отдельные области оригиналаизображение изолированно (такое, что приведенное выше изображение приведет к 6 приблизительно прямоугольным подизображениям).Я достиг некоторой степени успеха в этом, но это было сложно.Есть ли какой-либо ранее существующий модуль, который я могу использовать для этого?

Если нет, то будет полезен совет высокого уровня.

Подход на данный момент:

image_slic = seg.slic(image, n_segments=6)
borders = seg.find_boundaries(image_slic)
sub_images = []
new_seg = []
for every row of borders:
     new_seg.append([])
    for every pixel in every row:
         if (pixel is not a border and is not already processed):
              new_seg[-1].append(pixel)
              Mark pixel as processed
         elif (pixel is a border and is not already processed):
              break
    if (on the first pixel of a row OR the first unprocessed pixel):
         sub_images.append(new_seg)
         new_seg = []

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

1 Ответ

2 голосов
/ 18 мая 2019

Это может быть легко достигнуто с помощью логического индексирования NumPy :

import numpy as np
from skimage import io, segmentation
import matplotlib.pyplot as plt

n_segments = 6
fig_width = 2.5*n_segments

img = io.imread('https://i.imgur.com/G44JEG7.png')
segments = segmentation.slic(img, n_segments=n_segments)

fig, ax = plt.subplots(1, n_segments)
fig.set_figwidth(fig_width)

for index in np.unique(segments):
    segment = img.copy()
    segment[segments!=index] = 0
    ax[index].imshow(segment)
    ax[index].set(title=f'Segment {index}')
    ax[index].set_axis_off()

plt.show(fig)

segments

Вы можете получить тот же результат, используяNumPy's where работает следующим образом:

for index in np.unique(segments):
    segment = np.where(np.expand_dims(segments, axis=-1)==index, img, [0, 0, 0])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...