Един 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, очаква клип, който вече изглежда нормално на екрана.
#Къде е мястото му във веригата
Слагайте визията след корекциите, а не преди тях. Обичайният ред е:
- Преобразуване. Ако записът е log или raw, първо го преобразувайте към Rec.709 с управлението на цветовете в програмата или с техническия LUT на производителя на камерата. Творческата визия не е преобразуване.
- Корекция. Нагласете експонацията и баланса на бялото така, че сивата карта да е сива, а лицата да изглеждат като лица. Тук изравнете кадрите помежду им.
- Визията. Приложете творческия LUT последен, на отделен възел или коригиращ слой, за да можете да промените силата му или да го смените.
- Довършване. Дребни неща след визията, като винетка или последно докосване на контраста.
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 на възела, непрозрачността на слоя или силата на визията, или ползвайте версия на файла с половин сила.
Коментари
Коментари
Напишете първия коментар.
Оставете коментар