• Как получить яркость изображения?

    samodum
    @samodum
    Какой вопрос - такой и ответ
    Чтобы получить среднюю яркость цветного изображения надо пройтись по всему блоку и по каждой компоненте R G и B отдельно посчитать сумму. После этого каждую sumR, sumG и sumB разделить на количество пикселей в блоке, в данном случае это 256^2. Это и будут компоненты нового цвета
    Ответ написан
    Комментировать
  • Как получить яркость изображения?

    @Andy_U
    Aleksandr Makarov, Вы совершенно правильно сомневаетесь. Почитайте, например, вот эту статью: 1.

    Или вот тут есть рецепт: 2
    Ответ написан
    Комментировать
  • Как получить яркость изображения?

    adugin
    @adugin Куратор тега Python
    import numpy as np
    from skimage.util import view_as_windows  # Библиотека scikit-image
    
    tsize = 256
    image = np.random.randint(0, 256, (8192, 8192, 3), np.uint8)
    
    # Значения яркости - это канал L из пространства LAB
    lab_l_channel = cv2.cvtColor(image, cv2.COLOR_BGR2LAB)[..., 0]
    
    # Плитки 256x256
    tiles = view_as_windows(lab_l_channel, (tsize, tsize), (tsize, tsize))
    
    # Примечательно, что
    assert np.shares_memory(lab_l_channel, tiles) == True
    
    # Средняя яркость в виде матрицы 32х32
    lightness = tiles.reshape(-1, tsize ** 2).mean(axis=-1).reshape(np.array(image.shape[:2]) // tsize)

    P.S. Вместо skimage.util.view_as_windows можно использовать numpy.lib.stride_tricks.as_strided, но это весьма сложная в настройке правильных параметров функция; view_as_windows - её гуманный вариант)
    Ответ написан
    2 комментария
  • Как собрать изображение из отдельных частей и какие нюансы учесть?

    adugin
    @adugin Куратор тега Python
    skimage.util.montage

    Нюансы следующие:
    1) Большинство алгоритмов из библиотек чудовищно медленные. Это касается и PIL, и scikit-image, и tensorflow. Например, я написал аналог tf.image.non_max_suppression, который работает в 5 тысяч (!) раз быстрее. Делайте профайлинг кода, сравнивайте время исполнения и разные варианты решения задачи. Местами очень помогает @jit и @njit из numba.
    2) Если обрабатываете изображения в цикле, заранее аллоцируйте память под результат. Например, во многих функциях OpenCV есть параметр out, для которого можно заранее создать numpy.array с заданными shape и dtype.
    3) Если собираетесь работать с частями изображения, особенно с вырезкой фрагментов, сдвигом/поворотом и вообще аугментацией для нейросетей, используйте сразу матричные преобразования cv2.warpAffine() - это в разы быстрее, чем отдельные последовательные преобразования.
    4) Под Linux лучше ставить не pillow, а pillow-simd (pip install pillow-simd) - можете найти статью на Хабре.
    5) Очень полезная функция skimage.util.view_as_windows, и вообще разберитесь с numpy array views - это позволит избежать лишнего копирования данных. Также рекомендую разобраться с numpy.lib.stride_tricks.as_strided (лютый мозговынос; упомянутая выше функция view_as_windows - её гуманная версия).
    6) Гуглинг преобразований depth_to_space и space_to_depth (такие функции есть в Tensorflow).
    7) Очень полезная штука cv2.filter2D().
    Ответ написан
    Комментировать