#python #numpy #colors #grayscale
Вопрос:
Я довольно новичок в python и пытаюсь отделить цветные участки изображения от оттенков серого. Хотя этот код (см. Ниже) дает мне результаты, которые я ищу, он занимает много времени (более 10 секунд на обычных изображениях).
Я искал один час и не нашел подходящего ответа, так как большинство из них просто разделяют определенные цвета (черный, белый, …) или пороги.
Насколько я (уже) знаю, numpy-это правильный путь, но мне это не удалось :S
С нетерпением ждем помощи — Спасибо!!
gray_elements = np.zeros_like(image)
gray_elements[:] = 255
colored_segments = np.zeros_like(image)
colored_segments[:] = 255
# Separate black-to-white-colors from colored
for y in range(image.shape[0]):
for x in range(image.shape[1]):
pxl = image[y, x]
if max(pxl) - min(pxl) > 5:
colored_segments[y, x] = pxl
else:
gray_elements[y, x] = pxl
Ответ №1:
Непроверено, но так как сегодня День Святого Патрика…
Если у вас есть массив Numpy na
, содержащий 3-канальное RGB-изображение, он будет иметь na.shape
(h,w,3)
.
Вы можете получить максимум 3 канала в каждой точке с помощью:
ma = np.amax(na, axis=2, keepdims=True)
и минимум с:
mi = np.amin(na, axis=2, keepdims=True)
тогда разница с:
diff = ma - mi
Затем создайте логическую (истинную/ложную) маску с:
grey = diff < 5
Если/когда вы лучше познакомитесь с Numpy, вы, вероятно, будете использовать функцию «от пика к пику«.
Однако обычно вы используете OpenCV для преобразования в цветовое пространство HSL, а затем находите пиксели с низким уровнем насыщенности, что означает, что цвет ненасыщенный и довольно серый.
Комментарии:
1. Большое спасибо! Спас мне день! В итоге получилось немного больше кода, но теперь это намного быстрее 😉 1