Назначьте разные цвета для разных биологических клеток на изображении - PullRequest
0 голосов
/ 19 ноября 2018

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

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


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

biological cells

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

1 Ответ

0 голосов
/ 19 ноября 2018

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

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

  2. Найти все контуры и организовать их в двухуровневую иерархию.Это можно сделать, вызвав cv2.threshold с флагом RETR_CCOMP:

    На верхнем уровне существуют внешние границы компонентов.На втором уровне есть границы отверстий.Если внутри отверстия подключенного компонента есть другой контур, он все равно помещается на верхний уровень.

    Примечание: «Компоненты» - это белые части изображения, «дыры» - черные части..

  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)

Результат:

...