Найдите все пиксели, ограниченные двумя контурами в бинарном изображении в Python

У меня есть бинарное изображение, подобное показанному ниже, с двумя контурами, показанными белым цветом,

Я хочу сделать все пиксели между контурами белыми, как показано ниже:

Как я могу сделать это на 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 также будет иметь такое же ограничение.

возможное решение здесь

Ayush Naik 04.04.2023 06:58

Вы можете использовать drawContours(), пример здесь medium.com/featurepreneur/…

Mark Setchell 04.04.2023 09:20

как были сделаны эти строки?

Christoph Rackwitz 04.04.2023 11:41

@ChristophRackwitz они предоставлены комментатором.

Mohit Lamba 04.04.2023 12:00

инвертировать (редактировать: возможно, нет, проблемы с подключением), поэтому области являются объектами, линии их разделяют. найти контуры с иерархией. Иерархия ходьбы. обратите внимание, как работает иерархия и что в вашем случае она удваивается (изучите данные, чтобы узнать, что я имею в виду, потому что я не могу объяснить это, не показав вам)

Christoph Rackwitz 04.04.2023 12:11
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
5
125
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Подход:

  • 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 красным цветом, а затем наложения исходного кода, чтобы он выглядел красиво.

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

Другие вопросы по теме