Python OpenCV Заполните кружок, обведенный красным - PullRequest
1 голос
/ 28 января 2020

enter image description here

У меня есть изображение выше, и я просто хочу получить возможность обвести форму, выделенную красным, и покрасить все в этой форме в белый. Мой фрагмент кода ниже читает изображение, использует значение HSV, чтобы попытаться получить маску только из значений красного пикселя, но по какой-то причине это не работает. Я не получаю полный круг и просто получаю кучу точек вокруг окрестности. Я использую неправильные значения HSV?

im = cv2.imread(img, cv2.IMREAD_UNCHANGED)
hsv_im = cv2.cvtColor(im, cv2.COLOR_BGR2HSV)
lower_red = np.array([0, 80, 80], np.uint8)
upper_red = np.array([20, 255, 255], np.uint8)
frame_threshold_red = cv2.inRange(hsv_im, lower_red, upper_red)

Чтобы получить мои значения HSV, я делаю это:

red = np.uint8([[[0, 0, 224]]])
hsv_red = cv2.cvtColor(red,  cv2.COLOR_BGR2HSV) # 0, 255, 224

224 - значение красного пикселя. Я проверил это, посмотрев на фактические значения матрицы.

У кого-нибудь есть какие-либо предложения о том, как я могу это исправить? Должен ли я изменить значения HSV или использовать совершенно другой способ? Спасибо!

В настоящее время я получаю что-то вроде этого:

enter image description here

1 Ответ

2 голосов
/ 28 января 2020

Это должно помочь вам начать в соответствии с моим комментарием:

#!/usr/bin/env python3

import cv2
import numpy as np

# Load image and convert to HSV
im = cv2.imread("blob.png", cv2.IMREAD_UNCHANGED)
HSV = cv2.cvtColor(im, cv2.COLOR_BGR2HSV)

# Define lower and upper limits of "red"
redlo = np.array([0, 80, 80], np.uint8)
redhi = np.array([20, 255, 255], np.uint8)

# Mask red pixels
R = cv2.inRange(HSV, redlo, redhi)

# Calculate x,y coordinate of centre of red pixels
M = cv2.moments(R) 
cX = int(M["m10"] / M["m00"]) 
cY = int(M["m01"] / M["m00"]) 

# Flood fill with white starting from centroid
_, res, _, _ = cv2.floodFill(im,mask=None,seedPoint=(cX,cY),newVal=(255,255,255))

enter image description here

...