oosioo
같은 해변 사진 한 장을 여섯 가지로 바꾼 격자. 원본, 웜 파스텔 400(Kodak Portra 400 작례 기반), 비비드 네거 100(Kodak Ektar 100), 풍경 슬라이드 50(Fujichrome Velvia 50), 텅스텐 나이트 800(CineStill 800T), 모노 400 하드(Kodak Tri-X 400). 견본 사진 Wilfredor, CC0
연재진짜 딸깍하는 AI · 22회

필름 사진 1,027장을 읽혀 만든 원클릭 필름 카메라 — 스무 가지 필름 풍과, 작례로는 끝내 못 가른 필름들

Portra, Velvia, Tri-X 같은 필름의 공개 작례를 모아 색과 톤의 차이를 재고, 사진 한 장을 스무 가지 필름 풍으로 한꺼번에 바꾸는 앱을 만들었다. 톤은 작례를 따라갔다. 그런데 색 기울기는 필름이 아니라 스캔한 사람을 따라갔고, 슬라이드 필름 넷은 작례만으로는 서로 구별되지 않았다.

· SYSOP

같은 해변 사진 한 장을 여섯 가지로 바꾼 격자. 원본, 웜 파스텔 400(Kodak Portra 400 작례 기반), 비비드 네거 100(Kodak Ektar 100), 풍경 슬라이드 50(Fujichrome Velvia 50), 텅스텐 나이트 800(CineStill 800T), 모노 400 하드(Kodak Tri-X 400). 견본 사진 Wilfredor, CC0

후지필름 카메라를 쓰는 사람들은 "필름 시뮬레이션"을 고르는 맛에 찍는다고들 한다. 캐논에는 픽처 스타일이, 니콘에는 이미징 레시피가 있다. 라이트룸과 VSCO에는 필름 이름을 단 프리셋이 수백 개고, 인물 보정 앱 이보토도 참조 사진의 색을 옮겨 준다. 버튼 하나로 디지털 사진이 어느 필름으로 찍은 것처럼 바뀐다.

그런데 그 "어느 필름처럼"은 무엇을 기준으로 맞춘 걸까. 궁금해서 직접 해 보기로 했다. 인터넷에는 Portra 400이나 Velvia 50으로 찍었다고 밝힌 사진이 수만 장 올라와 있다. 그걸 모아 읽히면, 필름마다 색과 톤이 디지털과 어떻게 다른지 숫자로 나오지 않을까.

무엇을 하려 했나

하려던 일은 세 가지였다.

  1. 필름 룩을 만드는 기법을 논문과 실제 제품 양쪽에서 훑어 정리한다.
  2. 실제로 팔렸던 필름이라 인터넷에 작례가 많은 경우, 그 작례를 분석한 데이터로 룩을 만든다.
  3. 사진 한 장을 올리면 여러 필름 풍으로 한꺼번에 바꿔 주는 웹 앱을 만들고, 내 PC에서 돌린다.

조사는 AI가 따로 띄운 보조 작업 둘이 논문 쪽과 제품 쪽을 나눠 맡았다. 그사이 본 작업은 작례를 모으고 분석기를 짰다. 처음부터 앱과 원고 초안까지 한 시간 남짓 걸렸고, 그 절반쯤은 작례를 내려받는 시간이었다. 공개 이미지 검색 서비스가 익명 사용자에게 분당 20번, 하루 200번까지만 검색을 허락해서 천천히 받을 수밖에 없었다.

무엇이 나왔나

필름 랩 앱 화면. 해변 사진에 웜 파스텔 400 룩을 입힌 상세 보기. 가운데 세로선을 끌면 왼쪽은 원본, 오른쪽은 필름 풍이다. 아래 네 칸에 작례 68장(올린 사람 32명)에서 왔다는 출처, 톤 곡선, 색상별 채도 배율, 검증 결과가 적혀 있다

사진을 끌어다 놓으면 스무 가지 필름 풍이 한 화면에 깔린다. 하나를 누르면 원본과 나란히 놓고 선을 끌어 비교할 수 있고, 원본 크기로 저장하거나 그 룩을 LUT 파일(.cube)로 받을 수도 있다. LUT는 "이 색이 들어오면 저 색으로 내보내라"를 적어 둔 색 변환표다. 다빈치 리졸브나 다크테이블 같은 편집 프로그램에 그대로 넣어 쓸 수 있다.

사진은 브라우저 밖으로 나가지 않는다. 색 변환과 그레인은 전부 내 PC의 그래픽카드가 브라우저 안에서 계산한다. 강도나 그레인 슬라이더를 움직이면 스무 장이 그 자리에서 다시 그려진다.

스무 가지는 이렇다.

갈래룩(작례 기준 필름)
컬러 네거티브Kodak Portra 160·400·800, Ektar 100, Gold 200, UltraMax 400, Fujicolor Superia 400·Pro 400H·C200, CineStill 800T·50D
슬라이드Fujichrome Velvia 50·Provia 100F, Kodak Ektachrome E100, Kodachrome 64
흑백Ilford HP5 Plus·Delta 3200, Kodak Tri-X 400
카메라 필름 시뮬후지 Classic Chrome, Classic Neg.

앱 카드에는 필름 이름을 그대로 쓰지 않았다. "웜 파스텔 400", "풍경 슬라이드 50"처럼 내가 붙인 이름을 달고, 옆에 "Kodak Portra 400 작례 68장"처럼 어디서 왔는지만 적었다. 다른 제조사 필름 이름을 프리셋 이름으로 쓰지 않는 게 카메라 회사들의 관행이다. 앱 바닥에는 필름 이름은 각 상표권자의 것이고 공식 재현이 아니라는 문구를 붙였다.

다른 사진에도 입혀 봤다.

빨간 빙수 수레 사진을 일곱 가지로 바꾼 격자. 웜 파스텔 400은 빨강이 살짝 가라앉고 그늘이 들뜬다. 풍경 슬라이드 50은 빨강과 초록이 가장 진하다. 모노 400 클래식은 흑백이다. 견본 사진 Wilfredor, CC0

작례에서 읽어 낸 차이 가운데 몇 가지는 필름 사진 하는 사람들이 말로 전해 온 인상과 맞았다. 사진 한 장의 평균 채도를 재서 묶음마다 가운데 값을 냈더니, 디지털 작례가 0.038일 때 Velvia 50이 0.053으로 가장 진했고 Portra 400은 0.032로 디지털보다 옅었다. 풍경용 고채도 필름과 인물용 부드러운 필름이라는 평판 그대로다. 그러나 맞지 않는 것도 있었다. 선명한 색을 내세우는 Ektar 100은 0.039로 디지털과 거의 같았다.

어떻게 굴러갔나

  1. 작례를 모았다. 플리커의 CC 라이선스 사진을 모아 둔 공개 검색(Openverse)과 위키미디어 커먼즈에서 필름 이름으로 찾았다. 필름 24종과, 비교 기준이 될 디지털 카메라 사진을 받았다. 프리셋으로 흉내 낸 사진, 유통기한 지난 필름, 교차 현상, 필름 상자 사진은 제목과 태그로 걸렀다.
  2. 한 사람이 평균을 끌고 가지 않게 했다. 같은 사람이 올린 사진은 필름당 6장까지만 썼다. 한 사람의 스캐너와 보정 버릇이 그 필름의 색처럼 보이는 걸 막으려는 것이다. 그리고 사진마다 같은 수의 픽셀을 뽑아 큰 사진이 더 큰 목소리를 내지 못하게 했다.
  3. 두 묶음의 차이를 색 변환표로 바꿨다. 짝지은 사진이 없다. 같은 장면을 디지털과 필름으로 동시에 찍은 사진이 있으면 색을 일대일로 맞추면 되지만, 인터넷 작례는 그렇지 않다. 그래서 "디지털 사진 묶음의 색 분포를 필름 사진 묶음의 색 분포로 옮기는 변환"을 구했다. 2005년 피티에(Pitié) 등이 낸 방법으로, 색 공간을 무작위 방향으로 돌려 가며 한 축씩 분포를 맞추는 일을 되풀이한다. 그렇게 얻은 변환을 33×33×33칸 색 변환표로 구웠다. 흑백은 밝기 곡선과 남은 색조만 옮겼다.
  4. 검증은 사람 단위로 나눠서 했다. 작례를 올린 사람 기준으로 둘로 나눴다. 한쪽으로만 룩을 만들고 디지털 시험 사진 60장에 입힌 뒤, 학습에 안 쓴 사람들의 작례에 가까워지는지 쟀다. 같은 사람 사진이 양쪽에 섞이면 그 사람의 버릇을 맞힌 것을 필름을 맞힌 것으로 착각하게 된다.

남은 작례는 1,027장, 올린 사람은 286명이다.

어디서 틀렸나

첫 번째, 그레인은 작례에서 잴 수 없었다. 처음 계획은 필름 입자(그레인)의 세기도 작례에서 재는 것이었다. 사진에서 가장 매끈한 자리(하늘 같은 곳)를 골라 잔 떨림의 크기를 쟀다. 결과는 필름 0.0028, 디지털 0.0026이었다. 사실상 같은 값이다. Portra 160은 0.0022로 디지털보다도 낮게 나왔다.

인터넷에 올라온 필름 사진은 수천 화소로 스캔한 것을 1,024화소로 줄인 뒤 JPEG으로 압축한 것이다. 줄이면서 입자가 뭉개지고, 압축이 남은 걸 지운다. 그 크기에서 남는 떨림은 필름 입자가 아니라 디지털 노이즈와 압축 흔적이다.

그래서 그레인은 제조사 데이터시트로 돌렸다. 코닥은 컬러 네거티브의 입자를 "인화 입상도 지수(Print Grain Index)"로 적는다. Portra 160이 28, Portra 400이 37, Portra 800이 48이다. 슬라이드와 흑백은 확산 RMS 입상도로 적는데 Velvia 50이 9, Tri-X 400이 17이다. 두 척도는 서로 비교할 수 없어서 척도마다 따로 0에서 1 사이 점수로 옮겼다. 이 환산식은 눈으로 맞춘 것이다. 일포드는 HP5 Plus와 Delta 3200에 입상도 수치를 아예 싣지 않았고, 후지의 네거티브 세 종은 데이터시트 값이 모두 4라 서로 가르는 데 쓸 수 없었다. 이런 필름은 감도(ISO)로 추정했다. 앱의 각 룩에는 그레인이 어느 쪽에서 왔는지 적어 뒀다.

두 번째, 첫 방법은 너무 약했다. 처음에는 차이를 쪼개서 쟀다. 밝기 분포의 차이로 톤 곡선을 만들고, 밝기 구간마다 색이 어느 쪽으로 기우는지, 색상마다 채도가 얼마나 다른지를 따로 구해 합쳤다. Portra 400을 입혀 보니 원본과 거의 구별이 안 됐다. 장면 내용의 치우침을 줄이려고 중앙값을 쓰고 극단값을 잘라 냈는데, 그 바람에 필름의 특징까지 같이 깎였다.

그래서 색 분포를 통째로 옮기는 방법(앞에서 말한 피티에의 방법)으로 바꿨다. 이번엔 Portra 400, 160, 800이 눈에 띄게 서로 달라졌다. 그런데 너무 세게 옮기면 작례 묶음의 장면까지 옮겨 온다. 처음 설정(24번 되풀이, 한 번에 60%씩)과 약한 설정(10번, 35%씩)을 검증에 넣어 비교했고, 학습에 안 쓴 작례를 더 잘 맞힌 약한 쪽을 골랐다.

세 번째, 톤만 따라갔다. 검증 결과가 이 글에서 가장 중요한 숫자다.

막대그래프. 컬러 필름 14종 평균. 학습에 안 쓴 사람들의 작례와의 거리가, 톤은 입히기 전 0.077에서 입힌 뒤 0.046으로 40% 줄었다. 채도는 0.145에서 0.157로 8% 늘었고, 밝기별 색 기울기는 0.140에서 0.182로 31% 늘었다

컬러 필름 14종의 평균으로 보면, 룩을 입힌 디지털 사진은 밝기 분포에서 학습에 안 쓴 사람들의 작례에 40% 가까워졌다. 그런데 채도는 오히려 8% 멀어졌고, 밝기마다 색이 어느 쪽으로 기우는지(색 기울기)는 31% 멀어졌다. 처음의 약한 방법으로 해도 색 기울기는 26% 멀어졌다. 방법을 바꿔도 결과가 같았다.

필름이 그림자를 들뜨게 하고 밝은 부분을 부드럽게 누르는 성질은 누가 스캔했든 남는다. 하지만 사진이 노랗게 기우는지 푸르게 기우는지는 필름보다 현상소와 스캐너, 그리고 올린 사람의 화이트밸런스가 정한다. 한쪽 사람들의 작례로 배운 색 기울기는 다른 쪽 사람들에게 맞지 않았다.

"입힌 결과가 어느 필름 작례와 가장 닮았나"로 따져 봐도 같았다. 컬러 14종 가운데 자기 필름 작례와 가장 닮은 건 5종뿐이었다.

처음에는 이걸 잘못 읽었다. 흑백까지 넣어 평균을 냈더니 채도가 26% 가까워진 것으로 나왔다. 흑백 룩은 채도를 0으로 만드니 흑백 작례와는 당연히 가깝다. 그걸 빼고 다시 내니 위의 숫자가 됐다.

네 번째, 작례로는 가를 수 없는 필름이 절반이었다. 그럼 내 방법이 나쁜 건지, 작례 자체에 필름을 가를 정보가 없는 건지를 따로 봐야 했다. 같은 필름의 작례를 올린 사람 기준으로 둘로 나눠, 두 묶음 사이 거리와 다른 필름과의 거리를 비교했다. 같은 필름끼리가 확실히 더 가까워야 그 필름다움이 작례에 들어 있는 것이다.

가로 막대그래프. 같은 필름 두 묶음 사이 거리를 다른 필름과의 거리로 나눈 값. 후지 카메라 Classic Neg. 0.64, Portra 400 0.68, UltraMax 400 0.69, Ektar 100 0.71, Pro 400H 0.77, Portra 800 0.77은 초록(구별됨). Classic Chrome 0.83은 노랑. Ektachrome E100 0.95, Velvia 50 0.96, Portra 160 0.97, C200 1.01, Superia 400 1.02, Kodachrome 64 1.13, Provia 100F 1.52는 빨강(구별 안 됨)

14종 가운데 6종만 같은 필름끼리 확실히 가까웠다. 슬라이드 넷(Velvia, Provia, Ektachrome, Kodachrome)은 모두 같은 필름 두 묶음이 다른 필름만큼 멀었다. Provia 100F는 같은 필름끼리가 오히려 1.5배 멀었다. 슬라이드는 원래 스캔하기 까다로운 데다, Kodachrome 작례에는 수십 년 묵어 색이 바랜 옛 슬라이드 스캔이 섞여 있다. 그리고 Velvia 작례는 거의 다 풍경이다. 작례가 말해 주는 게 필름인지 피사체인지 가를 수 없다.

앱에는 이 결과를 그대로 붙였다. 빨간 쪽 7종은 카드에 경고 표시를 달고, 상세 화면에 "작례로 구별 안 됨"이라고 적었다. 빼 버릴까도 생각했다. 그래도 이 룩들은 "그 필름이라고 올라온 사진들의 평균"이라는 데는 거짓이 없다. 그게 필름의 성질이라고 말할 근거가 없을 뿐이다.

다섯 번째, 표본이 모자란 필름이 넷 있었다. ColorPlus 200(18장), Lomography 800(22장), 후지 Eterna 시뮬레이션(9장), 후지 Acros 시뮬레이션(0장)은 기준선 25장을 못 넘겨 뺐다. Acros는 검색어를 "Acros simulation"으로 좁혔더니 후보가 8장뿐이었고, 그마저 필름 Acros 100 사진이라 걸러졌다. 후지 필름 시뮬레이션은 카메라 안의 기능이라 사진 제목에 이름을 적는 사람이 드물다.

여섯 번째, 컬러 필름 작례 열 장에 한 장은 흑백이었다. 컬러 필름 이름으로 찾았는데 흑백 사진이 섞여 나왔다. 컬러 필름으로 찍고 흑백으로 바꿔 올린 사진이다. 사진 평균 채도가 거의 0인 것을 빼니 컬러 필름 15종에서 80장이 빠졌다. Portra 400에서만 16장이다. 디지털 기준 묶음에서도 160장 가운데 33장이 흑백이었다.

일곱 번째, 할레이션은 손으로 넣었다. CineStill 800T는 밝은 불빛 둘레에 붉은 번짐이 생기는 걸로 유명하다. 영화용 필름에서 빛 번짐을 막는 층을 벗겨 내 일반 현상소에서 현상할 수 있게 만들었기 때문이다. 이 번짐은 밤 장면의 불빛 주변에만 생겨서 작례 전체의 색 통계로는 잡히지 않는다. 그래서 밝은 부분을 흐리게 번져 붉게 얹는 효과를 따로 만들어 CineStill 두 종에만 걸었고, 앱에 "문헌의 특성을 손으로 넣었다"고 적었다.

남들은 어떻게 하나

조사해 보니 필름 룩을 만드는 방법은 크게 넷으로 나뉜다.

  • 실물을 측정한다. 데한서(Dehancer)는 필름을 세 가지 노출로 찍고, 손으로 인화한 뒤, 인화지를 분광측정기로 재서 프로필을 만든다고 밝힌다. 필름컨버트(FilmConvert)는 카메라마다 같은 차트와 장면을 디지털과 필름으로 나란히 찍어 맞추고, 그레인은 실제 필름을 6K로 스캔해 쓴다고 한다.
  • 스캔과 나란히 놓고 사람이 맞춘다. VSCO, RNI, Mastin Labs가 이쪽이다. VSCO는 프리셋 이름에 필름 이름 대신 KP4 같은 약어를 달고, 설명에 "Kodak Portra 400을 모델로 함"이라고 적는다.
  • 카메라 회사가 자기 필름을 안다. 후지필름의 필름 시뮬레이션은 회사 설명으로 2003년 FinePix F700의 컬러 모드에서 시작했다. 이후 Classic Chrome(2014), Acros(2016), Eterna(2018), Classic Neg.(2019), Nostalgic Neg.(2021), Reala Ace(2023)가 차례로 붙었다. 다른 카메라 회사는 남의 필름 이름을 쓰지 않는다. 리코는 "포지티브 필름", 소니는 영문 약어를 쓴다.
  • 참조 사진에서 색을 옮긴다. 포토샵의 색 옮기기나 이보토의 AI 색 맞춤이 이쪽이다. 학술적으로는 2001년 라인하드(Reinhard) 등의 색 전이 논문이 출발점이고, 이번에 쓴 피티에의 방법도 같은 줄기다.

내가 한 건 넷째 방법을 작례 수백 장에 건 것이다. 데한서와 필름컨버트가 굳이 실물을 찍고 재는 이유를 이번에 몸으로 알았다. 짝지은 데이터가 없으면 필름의 성질과 장면과 스캔한 사람의 버릇이 한데 섞여서 풀리지 않는다. 데한서조차 같은 필름도 제조 시기와 현상과 스캔에 따라 다르니 자기 프로필이 절대 기준은 아니라고 적어 두었다.

왜 한 줄로 되는가

필요한 재료가 거의 다 공개돼 있다. CC 라이선스 작례를 찾아 주는 공개 검색, 색 전이 논문, 제조사 데이터시트 PDF, 브라우저에서 그래픽카드를 쓰는 표준(WebGL)까지 다 있다. 사람이 하면 작례를 모으고, 논문을 찾아 읽고, 셰이더를 짜는 데서 며칠이 간다. AI는 그걸 한 시간 남짓에 했다. 조사 두 갈래를 따로 맡겨 놓고 본 작업을 동시에 굴린 덕도 있다.

그런데 이번에도 한 줄로 된 건 앱의 겉모습까지다. 룩이 믿을 만한지는 검증에서 갈렸다. 그레인을 못 잰다는 것, 색 기울기가 일반화되지 않는다는 것, 슬라이드 넷이 구별되지 않는다는 것은 모두 숫자를 뽑아 놓고 나서야 보였다. 검증을 안 했다면 스무 가지 룩이 다 그 필름이라고 적었을 것이다.

따라 하려면

  • 검증을 사람 단위로 나눠라. 사진을 무작위로 반 나누면 같은 사람 사진이 양쪽에 들어가 점수가 부풀려진다. 작례를 올린 사람 기준으로 나눠야 한다.
  • 잡음 바닥부터 재라. "같은 것끼리의 차이"가 "다른 것과의 차이"만큼 크면, 그 데이터로는 아무리 좋은 방법을 써도 가를 수 없다. 방법을 고치기 전에 이걸 먼저 보면 시간을 아낀다.
  • 평균을 낼 때 섞인 걸 빼라. 흑백을 넣은 평균이 컬러 결과를 좋게 보이게 만들었다. 성분과 갈래를 나눠 다시 보는 습관이 필요하다.
  • 데이터로 못 재는 건 출처를 밝히고 손으로 넣어라. 그레인과 할레이션이 그랬다. 섞어 놓고 다 측정한 척하면 안 된다.

못 하는 것

  • 필름을 재현하지 않는다. 이 앱의 룩은 "그 필름으로 찍었다고 올라온 사진들의 색 분포"를 옮긴 것이다. 필름 + 현상 + 스캔 + 보정이 합쳐진 결과다. 필름 자체의 응답과는 다르다.
  • 절반은 작례로 구별되지 않는다. 슬라이드 넷과 Portra 160, Superia 400, C200은 같은 필름 작례끼리도 다른 필름만큼 멀었다. 이 룩들은 참고용이다.
  • 색 기울기는 맞지 않는다. 결과가 너무 노랗거나 푸르면 강도 슬라이더를 낮추거나 편집 프로그램에서 화이트밸런스를 다시 잡는 게 낫다.
  • 그레인 세기는 눈으로 맞춘 환산식이다. 데이터시트 수치는 진짜지만, 그걸 화면 속 입자 크기로 옮긴 식은 내가 정했다.
  • 장면을 가리지 않는다. 피부만 보호하거나 하늘만 따로 다루는 기능은 없다. 사진 전체에 같은 변환이 걸린다.

필름 이름을 단 프리셋을 볼 때마다 "진짜 그 필름 같은가"를 묻곤 했다. 해 보고 나니 질문이 바뀌었다. 우리가 기억하는 그 필름의 색에는 동네 현상소의 스캐너와 사진을 올린 사람의 손이 같이 들어 있었다.

재미있게 읽었다면 꼭 의견을 달아달라.

출처

  • 작례: Openverse(플리커 CC 라이선스 이미지)·위키미디어 커먼즈. 통계 분석에만 썼고 이미지는 재배포하지 않았다
  • 견본 사진: Wilfredor, CC0 1.0 (위키미디어 커먼즈 「Peoples jumping in La Guardia beach」「Ice cream truck selling brushed」)
  • 색 분포 이송: F. Pitié, A. Kokaram, R. Dahyot, "N-Dimensional Probability Density Function Transfer and Its Application to Colour Transfer", ICCV 2005
  • 색 전이: E. Reinhard 외, "Color Transfer between Images", IEEE Computer Graphics and Applications, 2001
  • 입상도: Kodak 데이터시트 E-4050(Portra 400)·E-4051(Portra 160)·E-4040(Portra 800)·E-4046(Ektar 100)·F-4017(Tri-X 400), Fujifilm AF3-0221E2(Velvia 50)·AF3-036E(Provia 100F)
  • 후지필름 필름 시뮬레이션 연혁: fujifilm-x.com 「The World of Film Simulation」, FujiRumors 연표
  • 데한서·필름컨버트·VSCO 제작 방식: 각 사 공식 설명

이 연재를 처음부터 보시려면 진짜 딸깍하는 AI 로 가시오.

한마디 0

아직 한마디도 없소. 먼저 보태시오.

한마디 보태려면 들어오시오.