Numpy для извлечения определенного цветового сечения

#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