У меня есть бинарное изображение, подобное показанному ниже, с двумя контурами, показанными белым цветом,
Я хочу сделать все пиксели между контурами белыми, как показано ниже:
Как я могу сделать это на Python, используя Numpy, OpenCV или Scipy?
В настоящее время я использую FloodFill, как показано ниже,
from PIL import Image, ImageDraw
# read image
seed = [377,273]
rep_value = (255, 255, 0)
ImageDraw.floodfill(img, seed, rep_value, thresh=50)
img.save(f'cloud_floodfill_{seed}.png')
Но здесь мне нужно указать значение seed
. У меня есть тысячи изображений, подобных этому, где два контура можно перенести куда угодно. Как автоматизировать процесс для нескольких изображений.
Я предполагаю, что FloodFill OpenCV также будет иметь такое же ограничение.
Вы можете использовать drawContours()
, пример здесь medium.com/featurepreneur/…
как были сделаны эти строки?
@ChristophRackwitz они предоставлены комментатором.
инвертировать (редактировать: возможно, нет, проблемы с подключением), поэтому области являются объектами, линии их разделяют. найти контуры с иерархией. Иерархия ходьбы. обратите внимание, как работает иерархия и что в вашем случае она удваивается (изучите данные, чтобы узнать, что я имею в виду, потому что я не могу объяснить это, не показав вам)
Подход:
findContours
Иерархия для этой конкретной конфигурации при обходе будет содержать:
Вам нужна область между внутренним контуром контура и встроенным внешним контуром.
contours, hierarchy = cv.findContours(im, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)
# hierarchy is a vector<Vec4i> -> row vector of Vec4i, so (1,N,4), weird shape
hierarchy = hierarchy.squeeze(0) # remove that 1-dimension
composite = im.copy()
outline_outer = 0
outline_inner = hierarchy[outline_outer, 2]
inline_outer = hierarchy[outline_inner, 2]
new_contours = [contours[outline_inner], contours[inline_outer]]
cv.drawContours(image=composite, contours=new_contours, contourIdx=-1, color=255, thickness=cv.FILLED)
Эта иллюстрация была сделана путем рисования в версии BGR красным цветом, а затем наложения исходного кода, чтобы он выглядел красиво.
Этот подход можно распространить на произвольные числа и вложения. Просто нужно больше работать, чтобы ходить по иерархии. Редактировать: аналогичный вопрос задан для этого расширения
возможное решение здесь