Как я могу отфильтровать изображение, используя один цвет RGB? - PullRequest
0 голосов

Я новичок в мире Python, а также в программировании. Я должен выполнить следующую задачу: мне нужно сделать снимок экрана на моем P C, показывая определенную c область в режиме Google Maps Traffi c.

Traffi c отображается информация на 4 цвета. Эти цвета - зеленый, оранжевый, красный и более темный красный. С помощью простых программ я могу проверить, какие конкретно цвета c. Я имею в виду точные значения, например B: 150, G:100, R:75.

Как я могу выделить (сохранить) этот цвет и сделать все остальные пиксели белыми. Я уже пробовал использовать маскировку ВПГ, но у меня не было очень хороших результатов. Я тоже пробовал с трекбаром и HSV, результаты одинаковые. Я чаще всего использую OpenCV, matplotlib, numpy ... et c. Я подчеркиваю, что я хотел бы, если возможно, решение с rgb, что-то вроде l oop через все пиксели и оставить только те, которые имеют определенный цвет c. Спасибо!

Цвета нам нужны:

orange      R:255, G:151, B:77
green       R:99,  G:214, B:104
red         R:242, G:60,  B:50
Dark red    R:129, G:31,  B:31

ПРИМЕР

import cv2
import numpy as np
image = cv2.imread('08.00am.Monday.png')
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
lower = np.array([2, 100, 100])
upper = np.array([75, 255, 255])
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv, lower, upper)
output = cv2.bitwise_and(image,image, mask= mask)
cv2.imshow('image',output)
cv2.waitKey(0)
cv2.destroyAllWindows()

пример изображения

1 Ответ

3 голосов
/ 16 марта 2020

Мы можем начать с сегментирования каждого цвета (красный, зеленый, синий и темно-красный) на соответствующие отдельные маски, используя cv2.inRange(), а затем мы можем объединить все маски, чтобы создать одно изображение, в котором все пиксели либо с красным, зеленым , Синие или темно-красные пиксели отмечены. Затем мы можем просто наложить входное изображение на белый холст, где мы нашли нужные пиксели. Вы можете взглянуть на следующий код, чтобы лучше понять:

import cv2
import numpy as np

original_image = cv2.imread("/path/to/your/img.png")
t = 10  # tolerance

orange_thresh = cv2.inRange(original_image, np.array([77 - t, 151 - t, 255 - t]), np.array([77 + t, 151 + t, 255 + t]))
green_thresh = cv2.inRange(original_image, np.array([104 - t, 214 - t, 99 - t]), np.array([104 + t, 214 + t, 99 + t]))
red_1_thresh = cv2.inRange(original_image, np.array([50 - t, 60 - t, 242 - t]), np.array([50 + t, 60 + t, 242 + t]))
red_2_thresh = cv2.inRange(original_image, np.array([31 - t, 31 - t, 129 - t]), np.array([31 + t, 31 + t, 129 + t]))

combined_mask = orange_thresh + green_thresh + red_1_thresh + red_2_thresh
combined_mask_inv = 255 - combined_mask

combined_mask_rgb = cv2.cvtColor(combined_mask_inv, cv2.COLOR_GRAY2BGR)

final = cv2.max(original_image, combined_mask_rgb)

cv2.imwrite("./debug.png", final)

Результат:

enter image description here

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