Как удалить внешние круги на изображении, не затрагивая остальную часть изображения? - PullRequest
1 голос
/ 04 ноября 2019

У меня есть изображение, похожее на изображение, показанное ниже. enter image description here

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

Я пытался использовать cv2.HoughCircles для обнаружения красного круга и пытался преобразовать его в черный цвет, но некоторая часть красного круга осталась неизменной, как показано.

enter image description here

И это код, который я использовал для этого.

import numpy as np
import cv2

image = cv2.imread("13-14.png")
output = image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1.3, 145)

if circles is not None:
    circles = np.round(circles[0, :]).astype("int")

    for (x, y, r) in circles:
        cv2.circle(output, (x, y), r, (0, 0 , 0), 4)

cv2.imshow("output", np.hstack([image, output]))
cv2.waitKey(0)

Есть предложения? Заранее спасибо.

РЕДАКТИРОВАТЬ 1

Образец выходных данных, который я ищу, является разновидностью этого изображения (цветной или в оттенках серого).

enter image description here

Ответы [ 2 ]

5 голосов
/ 04 ноября 2019

Поскольку квадраты, по-видимому, "значительно" больше, чем толщина кругов, простое морфологическое раскрытие с использованием некоторого прямоугольного ядра (чтобы сохранить форму квадратов) должно работать здесь.

Это было бы моимрешение:

import cv2
from skimage import io          # Only needed for web grabbing images; for local images, use cv2.imread(...)

# Read provided example image
image = cv2.cvtColor(io.imread('https://i.stack.imgur.com/QfUOF.png'), cv2.COLOR_RGB2BGR)

# Mask non-white content
_, mask = cv2.threshold(cv2.cvtColor(image, cv2.COLOR_BGR2GRAY), 252, 255, cv2.THRESH_BINARY_INV)

# Apply morphological opening with 5x5 rectangular kernel to get rid of the circles
mod = cv2.morphologyEx(mask, cv2.MORPH_OPEN, cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5)))

# Obtain mask of parts to be erased from the difference of both masks
erase = mask - mod

# Set corresponding pixels in image to white
image[erase == 255] = (255, 255, 255)

cv2.imshow('mask', mask)
cv2.imshow('mod', mod)
cv2.imshow('erase', erase)
cv2.imshow('image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

Небелое содержимое mask выглядит следующим образом:

Mask

Модифицированная маска после открытияmod выглядит следующим образом:

Modified mask

Разница между этими частями, которые нужно стереть (erase):

To be erased

Наконец, все замаскированные пиксели устанавливаются в белый цвет:

Output

Надеюсь, это поможет!

3 голосов
/ 04 ноября 2019

Заливка в верхнем левом углу, заполнение сначала черным, затем белым, затем красным:

enter image description here

Как это случилось, я сделалэто с ImageMagick , как показано ниже, но вы можете сделать то же самое с пакетом Python:

magick circles.png \
   -fill black -draw "color 0,0 floodfill" \
   -fill white -draw "color 0,0 floodfill" \
   -fill red   -draw "color 0,0 floodfill" result.png

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...