На ум приходит простой подход:
Пороговое значение изображения для его преобразования в двоичную форму, поскольку предоставленное вами изображение содержит больше, чем просто 0 и 255.
Найти все контуры и организовать их в двухуровневую иерархию.Это можно сделать, вызвав cv2.threshold
с флагом RETR_CCOMP
:
На верхнем уровне существуют внешние границы компонентов.На втором уровне есть границы отверстий.Если внутри отверстия подключенного компонента есть другой контур, он все равно помещается на верхний уровень.
Примечание: «Компоненты» - это белые части изображения, «дыры» - черные части..
Итерация по контурам.Для каждого контура компонента (поскольку такие контуры размещены на верхнем уровне иерархии, у них нет родительского контура), нарисуйте многоугольник контура, заполненный случайным цветом.
Пример кода:
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)
Результат: