Към съдържанието
PN Scripts

Разработка

Как да ползвате .cube LUT, без да развалите картината: ред, сила и log запис

  • PN Scripts
  • 8 мин четене

Един LUT изглежда чудесно върху примера на продавача и ужасно върху вашия клип: кожата става оранжева, небето циан, а сенките са или сива каша, или плътно черно. В повечето случаи проблемът не е в LUT файла. Той е сложен на грешното място във веригата, върху запис, за който никога не е правен, или със сила, мислена за друг кадър. Тук обясняваме какво всъщност е 3D LUT, къде му е мястото в корекцията на цвета, защо се проваля върху log запис, как да го направите по-лек и как да прочетете и приложите .cube файл с няколко реда Python или с една команда на FFmpeg. И двете са пуснати точно както са отпечатани, Python на Python 3.12 с numpy.

#Какво е 3D LUT

3D LUT е таблица, която отговаря на един въпрос за всеки цвят: „влизат тези червено, зелено и синьо, кои червено, зелено и синьо излизат?“ Файлът .cube пази отговорите в мрежа. Размер 33 означава 33 стъпки на канал и 33 × 33 × 33 = 35 937 реда по три числа. Цветовете между точките на мрежата се интерполират от най-близките: трилинейната интерполация смесва осемте ъгъла на малкото кубче, в което попада цветът, а тетраедричната ползва четири от тях и е малко по-гладка при преливания.

От това следват две неща, които хората често забравят. Първо, LUT не знае нищо за камерата, експонацията или баланса на бялото ви; той само превръща числа в числа. Второ, той е неподвижен: каквото е влязло в него като „нормално средно сиво“, това очаква да види като средно сиво. Творческа визия, направена за стойности на екрана в Rec.709 или sRGB, очаква клип, който вече изглежда нормално на екрана.

#Къде е мястото му във веригата

Слагайте визията след корекциите, а не преди тях. Обичайният ред е:

  1. Преобразуване. Ако записът е log или raw, първо го преобразувайте към Rec.709 с управлението на цветовете в програмата или с техническия LUT на производителя на камерата. Творческата визия не е преобразуване.
  2. Корекция. Нагласете експонацията и баланса на бялото така, че сивата карта да е сива, а лицата да изглеждат като лица. Тук изравнете кадрите помежду им.
  3. Визията. Приложете творческия LUT последен, на отделен възел или коригиращ слой, за да можете да промените силата му или да го смените.
  4. Довършване. Дребни неща след визията, като винетка или последно докосване на контраста.

LUT, приложен преди баланса на бялото, запича цветния оттенък: коригирането на топъл кадър след топла визия дърпа срещу самата визия и резултатът е кален. Същото важи и за снимките: първо проявете raw файла, после заредете LUT като коригиращ слой отгоре.

#Защо изглежда зле върху log запис

Log записът е нарочно плосък. Средното сиво е по-високо, а черното е повдигнато, за да може камерата да запише повече степени светлина. Творческа визия, направена за Rec.709, чете тези плоски стойности като бледа, избеляла картина и ги бута съответно: контрастът, който добавя, пада на грешните места, а наситеността, която добавя, пада върху цветове, които още не са наситени. Решението не е по-силна визия, а първо преобразуване. Ако продавачът на LUT не казва какъв вход очаква визията, приемете, че е Rec.709, и я пробвайте върху преобразуван клип, никога направо върху log.

#Как да направите визията по-лека

Визията на пълна сила е отправна точка. Намаляването ѝ означава да смесите коригирания резултат с некоригирания: при 50 % всяка стойност попада по средата между двата. В DaVinci Resolve това е Key Output Gain на възела, в Premiere Pro плъзгачът Intensity на Look в Lumetri, във Photoshop непрозрачността на слоя Color Lookup. Файл .cube с половин сила прави същото в един файл, което помага в програми, които не могат да смесват, като някои инструменти за видео на живо.

#Четене и прилагане на .cube файл с код

Форматът е обикновен текст: незадължително заглавие, LUT_3D_SIZE, незадължителен входен обхват в DOMAIN_MIN и DOMAIN_MAX, после по един ред червено, зелено и синьо за всяка точка от мрежата, като най-бързо се сменя червеното, а най-бавно синьото. Този четец и едно трилинейно търсене се побират на един екран:

import numpy as np


def read_cube(path):
    """A 3D .cube file: LUT_3D_SIZE n, then n*n*n rows of R G B, red changing fastest."""
    size, lo, hi, rows = 0, np.zeros(3), np.ones(3), []
    for line in open(path, encoding="utf-8"):
        parts = line.split()
        if not parts or parts[0].startswith("#") or parts[0] == "TITLE":
            continue
        if parts[0] == "LUT_3D_SIZE":
            size = int(parts[1])
        elif parts[0] == "DOMAIN_MIN":
            lo = np.array(parts[1:4], float)
        elif parts[0] == "DOMAIN_MAX":
            hi = np.array(parts[1:4], float)
        elif parts[0][0] in "0123456789.-":
            rows.append([float(v) for v in parts[:3]])
    table = np.array(rows).reshape(size, size, size, 3)  # indexed [blue][green][red]
    return table, lo, hi


def apply_cube(rgb, table, lo, hi, strength=1.0):
    """Trilinear lookup for an (..., 3) array of display values; strength mixes with the input."""
    n = table.shape[0]
    x = np.clip((rgb - lo) / (hi - lo), 0, 1) * (n - 1)
    i = np.minimum(np.floor(x).astype(int), n - 2)
    f = x - i
    out = np.zeros_like(rgb, dtype=float)
    for db in (0, 1):
        for dg in (0, 1):
            for dr in (0, 1):
                w = ((f[..., 0] if dr else 1 - f[..., 0]) * (f[..., 1] if dg else 1 - f[..., 1])
                     * (f[..., 2] if db else 1 - f[..., 2]))
                out += w[..., None] * table[i[..., 2] + db, i[..., 1] + dg, i[..., 0] + dr]
    return (1 - strength) * rgb + strength * out


if __name__ == "__main__":
    import sys
    table, lo, hi = read_cube(sys.argv[1])
    pixels = np.array([[0.5, 0.5, 0.5], [0.85, 0.62, 0.48], [0.2, 0.35, 0.6]])
    for strength in (1.0, 0.5):
        print(strength, np.round(apply_cube(pixels, table, lo, hi, strength), 3).tolist())

Две проверки си струва да пуснете върху всеки LUT, преди да му се доверите. Таблица на идентичността, в която всяка точка води към себе си, трябва да върне входа си; нашата го направи, с грешка 2e-16. И средното сиво трябва да остане близо до сиво: при визия в тюркоазено и кехлибарено примерът превърна 0,5, 0,5, 0,5 в 0,505, 0,512, 0,502, затопли тон на кожата 0,85, 0,62, 0,48 до 0,913, 0,663, 0,45 и бутна едно синьо към тюркоазено. При сила 0,5 всяка стойност попадна по средата и съвпадна с файла с половин сила за същата визия до третия знак. Визия, която прави средното сиво видимо зелено или пурпурно, ще оцвети всеки неутрален тон в кадъра ви.

За видео FFmpeg прилага .cube директно, с тетраедрична интерполация, ако я поискате:

ffmpeg -i in.mp4 -vf "lut3d=file=look.cube:interp=tetrahedral" -c:a copy graded.mp4

Филтърът му haldclut приема другия разпространен формат, HaldCLUT: същата таблица, записана като изображение, която четат програми за снимки като G'MIC в GIMP, darktable и RawTherapee.

#Какво прави една визия добра

  • Сивите преливания остават подредени. По-тъмно сиво на входа трябва да дава по-тъмна стойност на изхода, иначе преливанията стават на ивици, а небето се чупи на стъпала.
  • Без рязко отрязване. Наситените цветове трябва да се дърпат към собствената си яркост, преди да ударят границата, за да остане червената табела червена, а не да стане плосък основен цвят.
  • Използваеми точки на черното и бялото. Избеляла визия нарочно повдига черното, но визия, която смазва всичко под 10 %, изхвърля детайл, който после не можете да върнете.
  • Черно-белите визии са наистина неутрални. R, G и B трябва да излизат равни, иначе „монохромната“ визия оставя лек оттенък, който се вижда при печат.

#Набор от визии, направени така

Направихме Filmwren, 24 визии за снимки и видео, от чист контраст и филмови тонове до тюркоазено и кехлибарено, нощен град, златен час, зимно синьо и три черно-бели визии. Всяка е като .cube с 33 точки, като .cube с половин сила и като HaldCLUT PNG. Визиите са изградени от прости монотонни стъпки (тонова крива, наклон, отместване и степен, баланс на бялото, наситеност, разделно тониране, избледняване и меко отрязване на гамата), а тестовете проверяват, че всяка визия държи стойностите в обхват, пази сивите преливания подредени, няма скокове между съседни точки на мрежата и че монохромните визии са точно сиви. Правени са за стойности на екрана в Rec.709 и sRGB, затова първо преобразувайте log записа. Файловете са приложени с код към три рендерирани сцени; не са отваряни в Resolve, Premiere, Final Cut Pro, Photoshop или OBS. Наборът е обявен като „Очаквайте скоро“.

#Често задавани въпроси

Защо LUT прави записа ми оранжев или твърде контрастен?

Обикновено защото е приложен, преди да са нагласени експонацията и балансът на бялото, или върху log запис, който не е преобразуван първо. Коригирайте кадъра, преобразувайте log към Rec.709 и чак тогава приложете визията.

Мога ли да сложа творчески LUT върху log запис?

Не директно. Преобразувайте записа към Rec.709 с управлението на цветовете или с технически LUT за вашата камера, после приложете творческата визия след него.

Стигат ли 33 точки, или ми трябват 65?

За гладки творчески визии 33 точки е обичайният размер и е предостатъчно. По-големите таблици имат значение за визии с резки промени, които добрата творческа визия така или иначе избягва.

Как да направя LUT по-слаб?

Смесете го с оригинала: намалете Key Output Gain на възела, непрозрачността на слоя или силата на визията, или ползвайте версия на файла с половин сила.

#Източници

Още по темата

Още по темата

Коментари

Коментари

Напишете първия коментар.

Оставете коментар

Следваща стъпка

pnscripts.com/bg/contact

Пишете на екипа

Попитайте за статия или ни разкажете за проект, който искате да изградим. Отговаряме до един работен ден.

Пишете ни

Семейството PN Scripts

Другите сайтове на PN Scripts

Хостингът, игрите и блогът имат свои сайтове, поддържани от същата компания.

  • pnscripts.com

    PN Scripts

    Софтуерно инженерство

    Уеб и мобилни приложения, API и игри по поръчка, плюс нашите продукти и плъгини с отворен код.

  • games.pnscripts.com

    Игри

    Игри и игрови сървъри

    Домът на игрите на PN Scripts: безплатни браузърни игри, които се играят веднага, а игровите сървъри предстоят.

  • hosting.pnscripts.com

    Хостинг

    Хостинг и инфраструктура

    Споделен хостинг, KVM VPS, самостоятелни сървъри и домейни от същата компания, която изработва проекта ви.

  • blog.pnscripts.com

    Блог

    Статии и бележки

    Практични статии за разработка на софтуер, хостинг, отворен код и игри, писани от хората, които ги създават.

    Вие сте тук