Вопрос

Я пытаюсь автоматизировать улучшение некоторых изображений, которые должны быть перенесены в цифровую кадр. У меня есть код, который изменяется, добавляет дату/время в наименее знаменитый (наименьший подробный) угол изображения и пасты вместе пары портретных изображений, чтобы избежать отображения одного портрета на экране низкого разрешения кадра 41:20.

Я внедрил фильтр с яркостью для тех картин, где освещение было не очень хорошим, используя colorsys.rgb_to_hsv Функция для расчета H, S, V полосы, работающих на V One, а затем преобразование обратно в RGB перед сохранением JPEG в цифровой кадре. Очевидно, что преобразование занимает много времени, даже используя itertools ухищрения; Мне удалось улучшить вещи, используя psyco.

Тем не менее, я заметил пример для PIL Image.convert где RGB может быть преобразован в Цветовое пространство XYZ Использование матрицы 4 × 4 в качестве второго аргумента для convert Метод, и я должен удивляться:

Как я могу преобразовать RGB в HSV (а затем HSV обратно в RGB), используя пользовательскую матрицу в convert Метод звонок? (Незначительные ошибки округления не важны в этом случае, поэтому я не против, чтобы каждая группа была выражена как серия из 0… 255 целых чисел)

Заранее спасибо.

Это было полезно?

Решение

Хотя я видел ссылки [1], которые утверждают, что цветовое пространство HSV является линейным преобразованием из RGB, что, по-видимому, подразумевает, что это можно сделать с помощью матрицы, я не смог найти или определить для себя, что такая матрица будет выглядеть как. В каком-то смысле это не удивительно меня не удивляет, основываясь на всех [аналогичных] не матричных процедурных реализациях, которые я также видел-то, как они это делают Смотреть линейный.

В любом случае, если изучать это, я столкнулся с [несколько устаревшей] статьей в бывшем исследователе SGI Пол Хеберлионлайн компьютерная графика ноутбук под названием Матричная операции для обработки изображений который описывает, как выполнить несколько различных цветовых преобразований, используя 4x4 матриц, которые могут вам помочь. Все приведенные примеры работают непосредственно на цветных изображениях RGB, и, как и преобразования геометрической матрицы, любая последовательность из них может быть объединена в одну матрицу с использованием конкатенации.

Надеюсь это поможет.


[1]: Преобразование цветового пространства <http://www.poynton.com/pdfs/coloureq.pdf>:

2.7.3 HSL (насыщение и легкость)

Это представляет собой множество сходных цветовых пространств, альтернативные названия включают HSI (интенсивность), HSV (значение), HCI (Chroma / Colurbound), HVC, TSD (насыщение Hue и тьма) и т. Д. Большинство из этих цветных пространств линейные преобразования из RGB и поэтому зависит от устройства и нелинейно. Их преимущество заключается в чрезвычайно интуитивном способе определения цвета. Очень легко выбрать желаемый оттенок, а затем слегка изменить его путем настройки его насыщения и интенсивности.

Другие советы

Формула для преобразования значения RGB в значение ВПГ можно найти здесь: http://www.rapidtables.com/convert/color/rgb-to-hsv.htm. Анкет Однажды мне это нужно было наоборот, и сделал для этого следующую функцию.

def hsb2rgb(hsb):
    '''
    Transforms a hsb array to the corresponding rgb tuple
    In: hsb = array of three ints (h between 0 and 360, s and v between 0 and 100)
    Out: rgb = array of three ints (between 0 and 255)
    '''
    H = float(hsb[0] / 360.0)
    S = float(hsb[1] / 100.0)
    B = float(hsb[2] / 100.0)

    if (S == 0):
        R = int(round(B * 255))
        G = int(round(B * 255))
        B = int(round(B * 255))
    else:
        var_h = H * 6
        if (var_h == 6):
            var_h = 0  # H must be < 1
        var_i = int(var_h)
        var_1 = B * (1 - S)
        var_2 = B * (1 - S * (var_h - var_i))
        var_3 = B * (1 - S * (1 - (var_h - var_i)))

        if      (var_i == 0):
            var_r = B     ; var_g = var_3 ; var_b = var_1
        elif (var_i == 1):
            var_r = var_2 ; var_g = B     ; var_b = var_1
        elif (var_i == 2):
            var_r = var_1 ; var_g = B     ; var_b = var_3
        elif (var_i == 3):
            var_r = var_1 ; var_g = var_2 ; var_b = B
        elif (var_i == 4):
            var_r = var_3 ; var_g = var_1 ; var_b = B
        else:
            var_r = B     ; var_g = var_1 ; var_b = var_2

        R = int(round(var_r * 255))
        G = int(round(var_g * 255))
        B = int(round(var_b * 255))

    return [R, G, B]
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top