← README · 4절 1 · 2 · 3 · 4 · English
c \in \lbrace R, G, B\rbrace$로 씁니다.
\mathrm{lum}(r, g, b) = 0.299r + 0.587g + 0.114b$입니다.
선을 찾을 때의 밝기는 흰 바탕에 얹은 색의 밝기 $L = \mathrm{lum}(A\cdot O_R + 1 - A, A\cdot O_G + 1 - A, A\cdot O_B + 1 - A)$입니다.
A\cdot O + (1 - A)\cdot 1$을 채널마다 쓴 것입니다. 참고: R9 ITU-R BT.601 · R1 Porter · Duff 1984k = \min(1, M / \max(w_0, h_0))$, $W = \max(1, \mathrm{round}(k\cdot w_0))$, $H = \max(1, \mathrm{round}(k\cdot h_0))$로
브라우저의 고품질 축소를 씁니다. $N = W\cdot H$입니다. 한계가 0이고 원본이 1600만 픽셀을 넘으면 경고를 띄웁니다.
A < 0.98$인 픽셀이 $0.001N$보다 많으면 투명 그림으로 봅니다. $A \le 0.02$인 픽셀은 빈 곳입니다.
s = \max(W, H) / 1000$은 그림 크기에 따른 배율입니다(길이 기준값에 곱함).
s^2$을 곱합니다. 참고: 이 프로그램에서 정한 규칙\mathrm{clamp}(x) = \min(1, \max(0, x))$, $\mathrm{smoothstep}(a, b, x)$는 $t = \mathrm{clamp}((x - a)/(b - a))$에 대한 $t^2(3 - 2t)$입니다($a > b$이면 거꾸로 내려가는 곡선).
t^2(3 - 2t) = 3t^2 - 2t^3$입니다. 𝑡 = 0에서 0, 𝑡 = 1에서 1이고 가운데 기울기가 1.5라, 두 문턱 사이를 이 곡선으로 이으면 가중치가 갑자기 바뀌지 않습니다. 참고: R47 Ebert et al. 2003\mathrm{clip}$ 아래에 붙은 구간 $[a, b]$는 값을 그 구간으로 자른다는 뜻입니다: $\min(b, \max(a, x))$.
[a, b]$로 넓힌 것입니다. 참고: 이 프로그램에서 정한 규칙\Delta E$는 CIE76(Lab 공간의 유클리드 거리)입니다. 색상각 차이는 $d = \lvert h_1 - h_2\rvert \bmod 360^\circ$에 대해 $\Delta h = \min(d, 360^\circ - d)$입니다.
\sqrt{\Delta L^{*2} + \Delta a^{*2} + \Delta b^{*2}}$(CIE76)을 색 차로 씁니다. 각도 차는 원 위에서 두 방향 중 짧은 쪽입니다. 참고: R7 CIE 2004 · R8 Mahy et al. 1994\eta_s$)는 $\text{값}/100$으로 0~1이 됩니다.
t_{high}$, 4.7의 그림자 문턱). 참고: 이 프로그램에서 정한 규칙\mathrm{round}$는 가장 가까운 정수(0.5는 올림), $\lfloor x \rfloor$ · $\lceil x \rceil$는 내림 · 올림입니다.
Math.round), 내림 · 올림은 바닥 · 천장 함수입니다. 참고: 이 프로그램에서 정한 규칙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을 씁니다.
\mathrm{dilate}_r(f)(x, y) = \max f(x + i, y + j)$($\lvert i \rvert, \lvert j \rvert \le r$에서의 최댓값. 침식은 최솟값, 그림 밖은 창에서 뺌).
행과 열로 나눈 1차원 슬라이딩 최대 / 최소를 단조 덱으로 계산해 픽셀당 $O(1)$입니다. 닫기는 팽창 뒤 침식, 열기는 침식 뒤 팽창입니다.
2r + 1$, 그림 밖은 가장자리 값을 되풀이)을 가로 · 세로로 3번 반복해 근사합니다.
상자 한 번의 분산이 $((2r + 1)^2 - 1)/12 = r(r + 1)/3$이므로 세 번이면 $r(r + 1) = \sigma^2$이 되고, 이를 풀면
$r = \max(1, \mathrm{round}((\sqrt{4\sigma^2 + 1} - 1)/2))$입니다. $\sigma < 0.3$이면 흐리지 않습니다.
n = 2r + 1$인 고른 분포의 분산은 $(n^2 - 1)/12$이고, 독립인 흐림을 겹치면 분산이 더해집니다. 상자 흐림 세 번은 중심 극한 정리로 가우시안에 가까워지고 분산이 $r(r + 1)$이 되므로, 원하는 $\sigma^2$에 맞춰 $r^2 + r - \sigma^2 = 0$의 양의 근을 반올림합니다. 상자 흐림은 누적 합으로 픽셀당 상수 시간입니다. 참고: R17 Wells 1986 · R14 Gonzalez · Woods 2018인페인팅: 모르는 픽셀을 아는 픽셀과의 거리 순서(바깥 겹부터)로 방문해, 한 겹 안쪽까지 확정된 8-이웃의 평균으로 채웁니다.
$\displaystyle U(p)=\frac1{|\mathcal N_p|}\sum_{q\in\mathcal N_p}U(q),\qquad \mathcal N_p=\lbrace q\in 8\text{-이웃}(p):\ \text{겹}(q)<\text{겹}(p)\rbrace$
거리 변환(체임퍼): 가로 · 세로 한 칸 1, 대각선 한 칸 $\sqrt 2$인 두 번 훑기(위 → 아래, 아래 → 위)로 가장 가까운 표시 픽셀까지의 거리를 근사합니다.
$\displaystyle d(p)=\min\big(d(p),\ d(q)+w_{pq}\big),\qquad w_{pq}\in\lbrace1,\sqrt2\rbrace$
“몇 걸음 안”이라고 쓴 곳은 4-이웃 너비 우선 탐색의 걸음 수(맨해튼 거리)입니다.
M = \min(n, M_\max)$개를 뽑고($n > M_\max$이면 복원 추출), k-means++ 방식으로 첫 중심은 고르게, 다음 중심은 지금까지의 가장 가까운 중심까지 거리의 제곱 $D(x)^2$에 비례하는 확률로 뽑습니다.
배정 → 평균 갱신을 최대 18번 하고, 4번째 반복부터 배정이 바뀐 표본이 $0.001M$ 미만이면 멈춥니다. 빈 군집은 가장 먼 표본으로 옮깁니다.
$M_\max$는 영역 나누기 50000, 색 모델의 영역 그래프 40000, 재질별 톤 6000입니다.
D(x)^2$에 비례해 뽑혀 첫 중심들이 퍼지므로, 기대 오차가 최적의 $O(\log k)$배 안으로 보장됩니다. 거리는 지각에 맞춘 Lab에서 잽니다. 참고: R22 Lloyd 1982 · R23 Arthur · Vassilvitskii 2007 · R7 CIE 2004s \gets s + \mathtt{0x6D2B79F5}$, $t = (s \oplus s \gg 15) \cdot(s \mathbin{\vert} 1)$, $t \gets t \oplus(t + (t \oplus t \gg 7) \cdot(t \mathbin{\vert} 61))$, 난수 $= (t \oplus t \gg 14)/2^{32}$입니다(≫는 부호 없는 오른쪽 시프트).
값 잡음(러프의 연필 결): 간격 $\mathrm{cell}$인 격자점마다 $[-1, 1]$의 난수 𝑔를 두고, 격자 칸 안에서 $s_x = \mathrm{smoothstep}(0, 1, t_x)$, $s_y = \mathrm{smoothstep}(0, 1, t_y)$로 섞습니다.
$\displaystyle n(x,y)=\big(g_{00}+(g_{10}-g_{00})s_x\big)(1-s_y)+\big(g_{01}+(g_{11}-g_{01})s_x\big)s_y$
x_0 = \lfloor x\rfloor,\ t_x = x - x_0$(세로도 같게)일 때 $f = f_{00}(1 - t_x)(1 - t_y) + f_{10}t_x(1 - t_y) + f_{01}(1 - t_x)t_y + f_{11}t_x t_y$.
r = n / m$(원래 칸 수 / 새 칸 수)이 1 이상이면 새 칸 𝑖가 덮는 원래 구간 $[ir, (i + 1)r)$의 면적 평균,
1 미만이면 $x = (i + 0.5)r - 0.5$에서의 **선형 보간**입니다.
(i + 0.5)r - 0.5$에서 선형 보간합니다. 참고: R14 Gonzalez · Woods 2018s_0 \dots s_{n-1}$에서 $x = (n - 1)q / 100,\ k = \lfloor x\rfloor$일 때 $s_k + (s_{k + 1} - s_k)(x - k)$(중앙값은 $q = 50$). 표준편차는 𝑛으로 나눈 모표준편차입니다.
z = (a - \text{평균})/\text{표준편차}$(표준편차가 $10^{-6}$ 이하이면 모두 0).
선 굵기 한계 𝑤(기본 $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-이웃 한 겹(안티에일리어싱 띠)까지를 모르는 곳으로, 거의 빈 픽셀이 아닌 나머지를 아는 곳으로 둡니다. 참고: 이 프로그램에서 정한 규칙
펜 굵기: 넉넉한 창 $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)
선이 덮은 픽셀은 표준 합성식을 만족해야 합니다.
O_c=a\,K_c+(1-a)\,U_c
풀이 — 왜: 선화는 표준(덮음) 층이므로 원본은 “선 색을 알파만큼 아래 색 위에 덮은 것”이어야 합니다. 이 식을 풀어야 선의 알파와 색이 나옵니다. 원리: 포터–더프의 over 합성(픽셀 넓이의 𝑎만큼을 잉크가 덮음)을 채널마다 쓴 식입니다. 아래 색 𝑈를 알면 𝐾와 𝑎 중 하나를 정해 나머지를 풉니다. 참고: R1 Porter · Duff 1984 · R2 Smith 1995
K = 0$): $a = \mathrm{clamp}(1 - \mathrm{lum}(O)/\mathrm{lum}(U))$($\mathrm{lum}(U) \le 0.01$이면 0)
O = (1 - a)U$라 $a = 1 - O/U$이고, 세 채널을 밝기 하나로 묶어 잡음을 줄입니다. 참고: R1 Porter · Duff 1984a = \mathrm{clamp}(\max_c(1 - O_c/U_c))$($U_c > 0.004$인 채널만), $K_c = \mathrm{clamp}((O_c - (1 - a)U_c)/a)$
a \ge 1 - O_c/U_c$여야 하므로 그 최댓값이 최소 알파이고, 그때의 𝐾는 합성식을 𝐾에 대해 푼 값입니다. 참고: R1 Porter · Duff 1984K^0$ = 알파 0.85 이상인 선 픽셀의 원본 색 채널별 중앙값(8비트 256칸 히스토그램에서 누적이 절반 이상이 되는 첫 칸)선 색 𝐾가 주어졌을 때의 최소제곱 알파($\sum_c (O_c - (aK_c + (1 - a)U_c))^2$을 가장 작게 하는 𝑎, 분모가 $10^{-5}$ 이하이면 0)
$\displaystyle a(K)=\mathrm{clamp}\!\left(\frac{\sum_c (U_c-O_c)(U_c-K_c)}{\sum_c (U_c-K_c)^2}\right)$
\sum_c (O_c - U_c - a(K_c - U_c))^2$은 𝑎의 2차식이라 미분을 0으로 두면 이 정규 방정식의 해가 나옵니다(1변수 최소제곱). 분모가 0에 가까우면(선 색과 아래 색이 같음) 풀 수 없어 0으로 둡니다. 참고: R43 Björck 1996 · R1 Porter · Duff 1984a(K^0) \ge 0.5$인 픽셀에서 실제 선 색 $K_c = \mathrm{clamp}((O_c - (1 - a)U_c)/a)$를 구하고, 선 영역($\mathrm{inMask}$) 전체로 인페인팅해 부드러운 선 색 $\tilde K$를 얻습니다.
\tilde K$를 얻습니다. 참고: R1 Porter · Duff 1984 · R20 Telea 2004\Delta E(\tilde K, K^0) \le 6$이고 $K^0$로 합성한 잔차가 채널별 8/255 이하이면 선화(기본 선 색), 아니면 색 트레이스입니다.
색 트레이스 알파는 원본이 0~1 범위 안의 선 색으로 정확히 재현되는 최소 알파 이상으로 잡습니다.
$\displaystyle a_{min}=\max_c\left\lbrace\,1-\frac{O_c}{U_c}\ (U_c>0.004),\ \ \frac{O_c-U_c}{1-U_c}\ (O_c>U_c,\ U_c<0.996)\right\rbrace,\qquad a=\max(a(\tilde K),a_{min})$
그 픽셀의 색 트레이스 색은 $K_c = \mathrm{clamp}((O_c - (1 - a)U_c)/a)$입니다. $1 - O_c/U_c$는 선 색이 0 아래로 내려가지 않을 최소 알파, $(O_c - U_c)/(1 - U_c)$는 1 위로 올라가지 않을 최소 알파입니다.
K = (O - (1 - a)U)/a$가 0 이상이려면 $a \ge 1 - O/U$, 1 이하이려면 $a \ge (O - U)/(1 - U)$(𝑂 > 𝑈일 때)여야 합니다. 이 하한들의 최댓값보다 작은 알파로는 어떤 색으로도 원본을 만들 수 없으므로, 최소제곱 알파와 이 하한 중 큰 값을 씁니다. 참고: R1 Porter · Duff 1984a(K^0)$와 $K^0$로 선화 한 장에 둡니다.
K^0$와 그 최소제곱 알파로 선화 한 장에 둡니다. 0.3%는 시험 그림으로 정했습니다. 참고: 이 프로그램의 실험(7.1)알파가 0.02 이하인 픽셀은 선이 아닌 것으로 보고 복원색을 원본으로 되돌립니다.