Illustracy

Illustracy — 4. 알고리즘과 수식 (1/4): 표기 · 색공간 · 기본 연산 · 선화

← README · 4절 1 · 2 · 3 · 4 · English


4.0 표기

4.1 색공간

sRGB를 선형화한 뒤 XYZ(D65)를 거쳐 Lab으로 바꿉니다.

C_{lin}=\begin{cases}C/12.92 & C\le 0.04045\\ \left(\frac{C+0.055}{1.055}\right)^{2.4} & \text{otherwise}\end{cases}
\qquad
L^*=116f(Y)-16,\; a^*=500\,(f(X/X_n)-f(Y)),\; b^*=200\,(f(Y)-f(Z/Z_n))

풀이 — 왜: sRGB 값은 화면 감마가 씌워진 값이라 빛의 양에 비례하지 않습니다. 색 차를 사람 지각에 맞게 재려면 먼저 빛의 양(선형 값)으로 되돌린 뒤 XYZ를 거쳐 Lab으로 가야 합니다. 원리: sRGB 규격의 전달 함수를 거꾸로 씁니다. 0.04045 이하는 직선(12.92로 나눔), 그 위는 2.4제곱 곡선입니다. Lab의 $L^*$은 $Y$의 세제곱근에 비례해 밝기 지각을 흉내 내고, $a^*$ · $b^*$는 빨강–초록, 노랑–파랑의 맞섬 축입니다. 참고: R6 IEC 1999 · R7 CIE 2004

f(t)=\begin{cases}t^{1/3} & t>0.008856\\ 7.787\,t+16/116 & \text{otherwise}\end{cases}

풀이 — 왜: 세제곱근은 0 근처에서 기울기가 무한대라, 그대로 쓰면 아주 어두운 색의 작은 잡음이 크게 부풀려집니다. 원리: $t \le (6/29)^3 \approx 0.008856$에서는 세제곱근과 값 · 기울기가 맞닿는 직선 $7.787t + 16/116$으로 바꿉니다(CIE 정의). 참고: R7 CIE 2004

선형 RGB에서 XYZ로는 sRGB(D65) 행렬을 쓰고, 기준 백색은 $X_n = 0.95047,\ Y_n = 1,\ Z_n = 1.08883$입니다.

풀이 — 왜: Lab은 “흰색에 비해 얼마나 밝고 어떤 색인가”를 재므로 기준 흰색이 필요합니다. 원리: sRGB의 흰색인 D65 광원의 XYZ 값을 $Y_n = 1$로 정규화한 것입니다. 참고: R7 CIE 2004 · R6 IEC 1999

\begin{pmatrix}X\\Y\\Z\end{pmatrix}=
\begin{pmatrix}0.4124564&0.3575761&0.1804375\\0.2126729&0.7151522&0.0721750\\0.0193339&0.1191920&0.9503041\end{pmatrix}
\begin{pmatrix}R_{lin}\\G_{lin}\\B_{lin}\end{pmatrix}

풀이 — 왜: 선형 RGB의 세 원색이 XYZ에서 어디에 있는지 정해져 있어, 3×3 행렬 하나로 바꿀 수 있습니다. 원리: 행렬의 열은 sRGB의 빨강 · 초록 · 파랑 원색(흰점 D65)의 XYZ이고, 가운데 줄(𝑌)이 휘도 가중치 0.2126 · 0.7152 · 0.0722입니다. 참고: R6 IEC 1999

선형화는 8비트 값 256칸 표로 미리 계산해 둡니다(𝐶를 $\mathrm{round}(255C)$칸으로). 채도 $C^* = \sqrt{a^{*2} + b^{*2}}$, 색상각 $h = \mathrm{atan2}(b^*, a^*)$(도 단위).

풀이 — 왜: 무채색 재질을 가르거나 그림자의 색상이 밝은 면과 가까운지 보는 규칙은 채도와 색상을 따로 봐야 합니다. 거듭제곱 계산은 픽셀마다 하면 느립니다. 원리: $(a^*, b^*)$ 평면의 극좌표로, 원점에서의 거리가 채도 $C^*$, 각이 색상 ℎ입니다. 8비트 입력은 256가지뿐이라 선형화 값을 표로 미리 계산해 둡니다. 참고: R7 CIE 2004 · R10 Fairchild 2013

Lab → sRGB(표본이 하나도 없는 톤의 색을 k-평균 중심에서 되살릴 때):

f_y=\frac{L^*+16}{116},\ f_x=f_y+\frac{a^*}{500},\ f_z=f_y-\frac{b^*}{200},\qquad
f^{-1}(t)=\begin{cases}t^3 & t^3>0.008856\\ (t-16/116)/7.787 & \text{otherwise}\end{cases}

풀이 — 왜: k-평균 중심은 Lab 값이라, 픽셀이 하나도 없는 톤의 색을 층에 칠하려면 sRGB로 되돌려야 합니다. 원리: 앞의 식을 거꾸로 풉니다. $L^*$에서 $f(Y)$를 얻고 $a^*$ · $b^*$를 더하거나 빼 $f(X/X_n)$ · $f(Z/Z_n)$을 얻은 뒤, 세제곱(직선 구간은 그 역)으로 되돌립니다. 참고: R7 CIE 2004

\begin{pmatrix}R_{lin}\\G_{lin}\\B_{lin}\end{pmatrix}=
\begin{pmatrix}3.2404542&-1.5371385&-0.4985314\\-0.9692660&1.8760108&0.0415560\\0.0556434&-0.2040259&1.0572252\end{pmatrix}
\begin{pmatrix}X_n f^{-1}(f_x)\\ f^{-1}(f_y)\\ Z_n f^{-1}(f_z)\end{pmatrix},\qquad
C=\begin{cases}12.92\,C_{lin} & C_{lin}\le 0.0031308\\ 1.055\,C_{lin}^{1/2.4}-0.055 & \text{otherwise}\end{cases}

풀이 — 왜: XYZ에서 선형 RGB로, 다시 감마를 씌운 sRGB로 가야 화면 · 파일 값이 됩니다. 원리: 앞 행렬의 역행렬과 sRGB 부호화 감마(0.0031308 이하는 12.92를 곱하는 직선, 그 위는 1/2.4제곱)입니다. 감마 전에 0~1로 자르는 것은 Lab의 일부 점이 sRGB 색역 밖이기 때문입니다. 참고: R6 IEC 1999 · R35 Strang 2016

($C_{lin}$은 0~1로 자른 뒤 감마를 씌웁니다.) 수동 보정 도구의 색 비교(4.17)도 같은 식의 Lab을 씁니다.

4.2 기본 연산

4.3 선화 검출

선 굵기 한계 𝑤(기본 $w_0 = \max(3, \mathrm{round}(4s))$, 아래 자동 설정 또는 설정값)로 밝기 𝐿을 클로징합니다.

\mathcal C=\mathrm{erode}_w(\mathrm{dilate}_w(L)),\qquad d=\mathcal C-L,\qquad
\mathrm{strength}=\min\!\left(\frac d{\mathcal C},\frac d{0.3}\right)\quad(\mathcal C>0.02,\ d>0)

풀이 — 왜: 선은 “주변보다 어둡고 펜 굵기보다 가는 것”입니다. 밝기의 골짜기 중 창보다 좁은 것만 골라야 넓은 어두운 칠(검은 옷)과 가를 수 있습니다. 원리: 팽창 뒤 침식(클로징)은 창 𝑤보다 좁은 어두운 골짜기를 둘레의 밝은 값으로 메우고 넓은 면은 그대로 둡니다. 원본과의 차 𝑑(블랙 탑햇)가 선의 깊이이고, 주변 밝기로 나눈 상대 깊이와 0.3으로 나눈 절대 깊이 중 작은 값을 써서 둘 다 깊어야 강한 선으로 봅니다. 참고: R15 Soille 2003 · R14 Gonzalez · Woods 2018

히스테리시스 임계값은 선 감도 $\eta \in[0, 1]$(기본 0.5)에서

t_{high}=0.58-0.34\,\eta,\qquad t_{low}=0.45\,t_{high}

$\mathrm{strength} \ge t_{high}$인 픽셀에서 출발해 $\mathrm{strength} \ge t_{low}$인 8-이웃으로 넓히고, $\max(4, \mathrm{round}(6s))$픽셀보다 작은 조각은 버립니다. $\mathrm{strength}$는 “주변의 밝은 칠($\mathcal C$)에 비해 얼마나 어두운가”($d/\mathcal C$)와 “절대적으로 얼마나 어두운가”($d/0.3$) 중 작은 값이라, 어두운 칠 위의 얕은 요철과 밝은 칠 위의 옅은 잡음을 모두 거릅니다.

풀이 — 왜: 문턱 하나로 자르면 진한 선 사이의 옅은 구간에서 선이 끊기고, 낮추면 잡음이 함께 잡힙니다. 원리: 센 문턱을 넘는 확실한 선에서 출발해 약한 문턱을 넘는 이웃으로만 이어 붙이는 히스테리시스(캐니 경계 검출과 같은 방법)입니다. 선 감도 𝜂가 높을수록 두 문턱이 함께 내려가는 1차식이고, 0.58 · 0.34 · 0.45와 작은 조각 크기는 시험 그림으로 맞췄습니다. 참고: R18 Canny 1986 · 이 프로그램의 실험(7.1)

교차점 채우기: 선에서 출발해 $w + 1$단계까지, 출발 선의 밝기 $L_{ref}$보다 0.05 이상 밝지 않고 $L \le 0.5$인 픽셀로 넓힙니다. 넓힌 덩어리 중 $w + 1$단계 끝까지 닿은 것(선 굵기를 넘어 이어지는 어두운 면)은 버리고 나머지를 선에 더합니다.

풀이 — 왜: 선이 여럿 모이는 교차점은 창보다 넓은 어두운 덩어리가 되어 클로징이 메우지 못하므로 선이 끊깁니다. 원리: 선에서 시작해 창 크기 + 1 걸음까지만 어두운 픽셀로 번지게 하고, 끝까지 닿은 덩어리(펜 굵기를 넘는 면)는 버려 교차점만 메웁니다. 0.05 · 0.5는 시험 그림으로 정했습니다. 참고: 이 프로그램의 실험(7.1)

선명한 선:

d>0.02,\qquad \mathrm{strength}\ge 0.45,\qquad \frac{G_{1.5}(L)-L}d\ge 0.25

풀이 — 왜: 배경은 초점이 나간 듯 흐리게 그리는 경우가 많아, 진하고 또렷한 선은 캐릭터를 가리키는 단서입니다. 원리: 가는 선은 살짝(σ = 1.5) 흐리기만 해도 둘레의 밝은 값과 섞여 깊이가 크게 줄고, 이미 흐린 자국은 더 흐려도 거의 그대로입니다. 그래서 흐린 뒤 깊이가 25% 넘게 사라지는 선만 선명하다고 봅니다(피사계 심도와 같은 원리, 5절). 참고: R13 Hecht 2017 · 이 프로그램의 실험(7.2)

$G_\sigma$는 가우시안 흐림입니다. 세 번째 조건은 “살짝 흐리면 깊이의 25% 이상이 사라지는 가는 선”을 뜻합니다.

선과 그 8-이웃 1px을 $\mathrm{inMask}$, 나머지 픽셀 중 $A > 0.02$인 것을 $\mathrm{known}$으로 둡니다.

풀이 — 왜: 선과 그 가장자리 픽셀은 원래 색을 모르므로 색 통계 · 채우기에서 빼야 합니다. 원리: 선에서 8-이웃 한 겹(안티에일리어싱 띠)까지를 모르는 곳으로, 거의 빈 픽셀이 아닌 나머지를 아는 곳으로 둡니다. 참고: 이 프로그램에서 정한 규칙

자동 설정(최대 선 굵기가 0일 때)

펜 굵기: 넉넉한 창 $R_b = \max(8, \mathrm{round}(12s))$로 위와 같은 $\mathrm{strength}$를 구하고, $\mathrm{strength} \ge 0.5$인 구조의 거리 변환 𝐷(체임퍼)에서 4-이웃 극대점($D(p) \ge$ 네 이웃의 𝐷, 중심선)마다 굵기 $2D - 1$($\ge 1.8$)을 셉니다. 굵기를 $\mathrm{round}$한 1px 칸 히스토그램 ℎ(0~63)에서 $w = 2, \dots, 59$ 중 $\lvert k - w \rvert \le \max(1, \mathrm{round}(0.2w))$인 $h_k$의 합이 가장 큰 굵기가 봉우리 𝑚이고, 𝑚의 3배 이하인 굵기들을 오름차순으로 놓은 $\lfloor 0.9(n - 1)\rfloor$번째 값(소수 첫째 자리)이 펜 굵기 $w_{90}$입니다. 중심선이 150개 미만이면 재지 않습니다.

풀이 — 왜: 작은 그림에 굵은 펜으로 그리면 기본 창이 선을 담지 못해 선을 거의 못 찾으므로, 그림의 펜 굵기를 재야 합니다. 원리: 넓은 창으로 찾은 어두운 구조의 거리 변환에서 극대점이 중심선이고, 그 값의 2배 − 1이 그 자리의 굵기입니다. 같은 펜은 한 굵기에 몰리므로 히스토그램을 ±20% 창으로 합친 봉우리를 찾고, 그 3배 이하(교차점 · 칠 제외) 굵기들의 90% 값을 펜 굵기로 둡니다. 참고: R21 Borgefors 1986 · R14 Gonzalez · Woods 2018 · 이 프로그램의 실험(7.1)

w=\begin{cases}\min\big(16,\ \lceil w_{90}/2\rceil+1\big) & \lceil w_{90}/2\rceil+1\ \ge\ w_0+2\\ w_0 & \text{그 밖}\end{cases}

풀이 — 왜: 다른 단계(선 밀도로 배경 찾기)는 기본 창에 맞춰져 있으므로, 잰 펜 굵기가 기본 창을 분명히 넘을 때만 창을 넓혀야 다른 그림이 흔들리지 않습니다. 원리: 반지름 𝑤 정사각형 클로징은 폭 $2w + 1$까지의 골짜기를 메우므로 펜 굵기의 절반 + 1이면 선을 담습니다. 이 값이 기본값보다 2 이상 클 때만 쓰고 16에서 멈춥니다. 참고: R15 Soille 2003 · 이 프로그램의 실험(7.1)

4.4 선 알파와 선 색

선이 덮은 픽셀은 표준 합성식을 만족해야 합니다.

O_c=a\,K_c+(1-a)\,U_c

풀이 — 왜: 선화는 표준(덮음) 층이므로 원본은 “선 색을 알파만큼 아래 색 위에 덮은 것”이어야 합니다. 이 식을 풀어야 선의 알파와 색이 나옵니다. 원리: 포터–더프의 over 합성(픽셀 넓이의 𝑎만큼을 잉크가 덮음)을 채널마다 쓴 식입니다. 아래 색 𝑈를 알면 𝐾와 𝑎 중 하나를 정해 나머지를 풉니다. 참고: R1 Porter · Duff 1984 · R2 Smith 1995

알파가 0.02 이하인 픽셀은 선이 아닌 것으로 보고 복원색을 원본으로 되돌립니다.


← README · 다음: 4.5 배경