포토쇼가 되고 싶다 Part 1: 톤 커브
포토 쇼가되고 싶다.
개요
참고 :이 기사는 Python3 & OpenCV에서 이미지 처리 배우기 [3] ~ 톤 커브와 LUT를 이해하는 구현 실험과 내용이 악마만큼 덮여 있습니다
톤 커브
↓이
요컨대 $[0, 255]\rightarrow [0, 255]$의 함수
LUT
모든 픽셀에 매번 계산하면 너무 무거워 쌓이지 않습니다.
→$[0, 255]\rightarrow [0, 255]$로, 기본적으로는 정수치이므로 256×256의 표가 있으면 좋다
→LUT(Look Up Table)
톤 커브 편집계의 이펙트는, 모두 「LUT를 만지기→LUT에 따라 화상을 변환한다」라고 하면 좋다
editLUT.js
function editLUT(img) {
const lut = new Array(256);
for (let i = 0; i < 256; i += 1) {
let val = hoge(i); //ここでエフェクトをかける
lut[i] = val;
}
LUT(img, lut);
return img;
}
노출
k배만
f(v) = kv
다만, k가 1을 넘을 때 밝은 곳이 클립하므로 대처한다
exposure.js
function exposure(x, t) {
return Math.min(x * t, 255);
}
감마
정규화하고 감마만
f(v) = v^\gamma
(자세한 내용은 감마 보정의 똥 참조)
gammaFunc.js
const gammaFunc = (val, gamma) => 255 * Math.pow(val / 255, 1 / gamma);
양 로그 스케일
감마보다 양쪽 끝에 부드럽습니다.
(자세한 내용은 스케일 로그 곡선을 톤 커브로 사용하는 이미지 보정 참조)
f(v) = \frac{{\rm log}(1+Cv)}{{\rm log}(1+C)}\\
역함수:
f^{-1}(v) = \frac{e^{v{\rm log}(1+C)}-1}{C}
log_log_scale.js
const log_log_scale = (v, C) =>
C == 0 ? v
: C > 0 ? 255*Math.log(1+v/255*C)/Math.log(1+C)
: -255*(Math.exp(v/255*Math.log(1-C))-1)/C;
대비
어두운 곳을 더 어둡고 밝은 곳을 밝게 → S자 곡선
기본적으로 시그모이드로 좋다.
(자세한 내용은 시그모이드 함수로 대비 강조 참조)
그렇지만 정의 영역이 유계가 아니기 때문에 조금 수정해도 좋다
(자세한 토론은 Sigmoid 곡선의 정의 영역과 값 영역을 [0,1]로 설정하고 싶습니다. 참조)
pseudoSigmoid.js
const pseudoSigmoid (x, t, MAX) => // Maxは255とか
t === 0 ? x
: t > 0 ? (Math.asinh((2 * x / MAX - 1) * Math.sinh(t)) / 2 / t + 0.5) * MAX
: (Math.sinh(t * (2 * x / MAX - 1)) / 2 / Math.sinh(t) + 0.5) * MAX;
중심 값을 괴롭히고 싶다면 시그모이드 함수로 대비 강조 구현이 좋을 것 같습니다.
요약
Reference
이 문제에 관하여(포토쇼가 되고 싶다 Part 1: 톤 커브), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/music_shio/items/9a17199480c92d31a18c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)