Я рисую самый большой контур на изображении.Но заполнение его цветом не работает.Любая идея?? - PullRequest
0 голосов
/ 28 декабря 2018

Я пытаюсь вырезать часть головы из изображения, меняя цвет ткани на значение белого пикселя.Для этого у меня есть:

1) Обрезать изображение снизу (10 рядов пикселей).

2) Рассчитать его средний цвет и присвоить его цвету ткани.

3) Сделайте нижний и верхний цветовой диапазон вручную вычитая и добавляя 50 пикселей значений в среднее значение пикселей.

4) Нахождение контуров.

5) Нахождение самых больших контуров и нанесение их на изображение.

Проблема в том, что при рисовании самых больших контуров и заполнении их белым цветом,это не заполняется.Но если я нарисую все контуры и заполню его белым цветом, он заполняется.Что происходит ??

Мой код для обнаружения ткани и изменения его на белый:

import cv2
import numpy as np
img4 = cv2.imread('Test.jpg')
img5 = cv2.cvtColor(img4, cv2.COLOR_BGR2RGB)

#CLoth detection and removal
crop_img_bottom = img5[490:, :]

bottom_H = np.average(crop_img_bottom[:, :, 0])
bH = int(bottom_H)

bottom_S = np.average(crop_img_bottom[:, :, 1])
bS = int(bottom_S)

bottom_V = np.average(crop_img_bottom[:, :, 2])
bV = int(bottom_V)

lower_cloth_color = np.array([bH-50, bS-50, bV-50])
upper_cloth_color = np.array([bH+50, bS+50, bV+50])
cloth_mask = cv2.inRange(img5, lower_cloth_color, upper_cloth_color)

_, contours, _ = cv2.findContours(cloth_mask, cv2.RETR_TREE, 
cv2.CHAIN_APPROX_NONE)

c = max(contours, key = cv2.contourArea)

cv2.drawContours(img5, c, -1, (255,255, 255), -1) 

cv2.imshow("Cloth", img5)
cv2.waitKey(0)
cv2.destroyAllWindows()

Вот изображение:

Исходное изображение

Original Image

Макс. Нарисованный контур (белая линия на границе ткани (почти))

Max contour drawn

Но если я возьму код для самого большого контура и заменим c на контуры в

cv2.drawContours(img5, c, -1, (255,255, 255), -1)  

как

cv2.drawContours(img5, contours, -1, (255,255, 255), -1) 

, я получу следующий вывод:

Все контуры нарисованы

All contour drawn

Но мне нужно заполнить только самый большой контур, так что, похоже, извлекается только часть головы.Что я делаю не так?

Я поменяю его на BGR позже.

1 Ответ

0 голосов
/ 28 декабря 2018

cv2.drawContours ожидает список контуров.Если вы поместите c в список в функции, как показано, вы получите изображение ниже.

cv2.drawContours(img5, [c], -1, (255,255, 255), -1)

enter image description here

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