Заполните внутри отфильтрованного контура OpenCV Python - PullRequest
0 голосов
/ 18 апреля 2020

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

import cv2
import numpy as np
import imageio

## Read
img = cv2.imread("test.png",-1)
img2 = imageio.imread("test.png")
## convert to hsv
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

## mask of green (36,25,25) ~ (86, 255,255)
# mask = cv2.inRange(hsv, (36, 25, 25), (86, 255,255))
mask = cv2.inRange(hsv, (36, 25, 25), (70, 255,255))

## slice the green
imask = mask>0
green = np.zeros_like(img, np.uint8)
green[imask] = img[imask]

green_filter=img[100,100,0]
print(green_filter)


## save 
cv2.imshow('image', green)
cv2.imshow('  ',img)
cv2.waitKey(0)
print(img)
print(green)

изображение, которое у меня есть: https://ibb.co/vJX1jM4 изображение, которое я достиг в настоящее время: https://ibb.co/FnScYHc

Ответы [ 2 ]

1 голос
/ 18 апреля 2020
import cv2
import numpy as np
import matplotlib.pyplot as plt
import imageio

## Read
img = cv2.imread("test.png",-1)
## convert to hsv
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

mask = cv2.inRange(hsv, (36, 25, 25), (70, 255,255))
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) 
idx = 0 
mask1 = np.zeros_like(img) 

cv2.drawContours(mask1, contours, idx, (255,255,255), -1) 
out = np.zeros_like(img)
out[mask1 == (255,255,255)] = img[mask1 == 255]

fig, axs = plt.subplots(1, 3, figsize=(16, 4))
for ax, image in zip(axs, ['img', 'mask1', 'out']):
    ax.imshow(eval(image))
    ax.set_title(image)
    ax.grid(True)

plt.show()

=>

Processing

Я позволю вам поиграть с этим фрагментом, особенно если вы хотите удалить свой зеленый контур.

Если вы хотите перевернуть сохраненную область, вам необходимо заменить:
out[mask1 == (255,255,255)] = img[mask1 == 255]
на:
out[mask1 == (0,0,0)] = img[mask1 == 0]
(см. Второй рисунок ниже)

Reverse result

Я только что импортировал matplotlib для удобства здесь.

0 голосов
/ 18 апреля 2020

Извините за быстрый и грязный код sudo здесь, но, как правило, вы бы go об этом.

Load in image
Convert to grayscale
Find Contours
Find the index of the contour you want to fill
Use fillConvexPoly to fill the specific contour with the index found above.

Вот код, который может направить вас в правильном направлении.

#Read in the image
img = cv2.imread("test.png")

#Convert to grayscale
grayImg = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#Find contours
contours = cv2.findContours(edged, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

#Find contour index that you want
#I didn't put code here because I don't know what index would work for your image,
#But you can manually find it by just drawing each contour found one by one until
#You get the contour you want, then use that index to fill it.

#Fill the contour
#NOTE: You will have to adjust this function for your own code
cv2.fillConvexPoly(img, contours[index], lineType=8, shift=0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...