Назначение разных цветов разным биологическим клеткам на изображении

Мне нужно назначить разные цвета разным биологическим клеткам на изображении.

Чтобы быть более конкретным, изображение только черно-белое (поэтому матрица только 0 и 255). Содержимое ячеек (исключая границы) представлено белым цветом, тогда как границы ячеек представлены черным цветом. Каждая ячейка окружена некоторыми границами ячеек или краями изображения. Я надеюсь назначить разные цвета разным ячейкам, чтобы я мог сразу сказать, в каких ячейках я сейчас нахожусь, просто взглянув на значение их записи.


Редактировать: Это биологические клетки. Я нашел что-то подобное в Интернете:

биологические клетки

Источник: http://brainiac2.mit.edu/isbi_challenge/


person NeverBe    schedule 19.11.2018    source источник
comment
Вы говорите о биологических клетках? Или таблицы Excel? Я думаю, картинка не помешала бы.   -  person Mark Setchell    schedule 19.11.2018
comment
Это биологические клетки. Я только что отредактировал свой вопрос.   -  person NeverBe    schedule 19.11.2018
comment
Помимо решения, опубликованного @Dan Mašek, я обнаружил, что skimage.measure.label из пакета skimage также может работать. Возможно, эта дополнительная информация может помочь некоторым людям в будущем. Источник: scikit-image.org/docs/ dev/api/   -  person NeverBe    schedule 19.11.2018


Ответы (1)


На ум приходит простой подход:

  1. Порог изображения для его бинаризации, поскольку тот, который вы предоставили, содержит больше, чем просто 0 и 255.

  2. #P3# <блочная цитата> #P4# #P5#
  3. Повторяйте контуры. Для каждого контура компонента (поскольку такие контуры располагаются на верхнем уровне иерархии, у них нет родительского контура) нарисуйте многоугольник контура, залитый случайным цветом.


Пример кода:

import cv2
import numpy as np

img = cv2.imread('cells.png', cv2.IMREAD_GRAYSCALE)
thresh = cv2.threshold(img, thresh=128, maxval=255, type=cv2.THRESH_BINARY)[1]
_, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)

output = cv2.cvtColor(thresh, cv2.COLOR_GRAY2BGR)
for i, contour in enumerate(contours):
    if hierarchy[0][i][3] == -1:
        colour = cv2.randu(np.zeros(3, np.uint8), 0, 256)
        cv2.drawContours(output, contours, i, colour.tolist(), -1)

cv2.imwrite('cells_colour.png', output)

Результат:

person Dan Mašek    schedule 19.11.2018
comment
Спасибо! Это то, что я ищу. - person NeverBe; 19.11.2018
comment
Отличное решение! - person Mark Setchell; 20.11.2018