Ver3.5 ๐ฌ ์์ ํ์ดํธ๋ฐธ๋ฐ์ค ์๋ ๋ณด์ ๊ณผ ์์จ๋ ์กฐ์

๐ฌ ์์ ํ์ดํธ๋ฐธ๋ฐ์ค ์๋ ๋ณด์ ๊ณผ ์์จ๋ ์กฐ์
์์ด ์ด์์๋ ์์์ ๋ง๋๋ ํต์ฌ ๊ธฐ์ , ์ง๊ธ ๋ฐ๋ก ํํค์ณ๋ณด์!
์ผ, ์์งํ ๋งํด๋ด. ๐ธ ์ด์ฌํ ์ฐ์ ์์์ธ๋ฐ ์ ์ด๋ ๊ฒ ๋ ธ๋๊ฑฐ๋ ํ๋๊ฒ ๋์ค๋ ๊ฑฐ๋๊ณ ์ต์ธํ๋ ์ ์์ด? ๋ถ๋ช ํ ๋์ผ๋ก ๋ณผ ๋ ์๋ฒฝํ๋๋ฐ, ํธ์ง ํ๋ก๊ทธ๋จ์์ ์ด์ด๋ณด๋ฉด ๋ญ๊ฐ ์์ด ์ด์ํ๊ณ ์ด์ํ ๋๋... ๊ทธ๊ฒ ๋ฐ๋ก ํ์ดํธ๋ฐธ๋ฐ์ค(White Balance) ๋ฌธ์ ์ผ. ์ค๋์ ์ด ํ์ดํธ๋ฐธ๋ฐ์ค๊ฐ ๋ญ์ง, ์๋ ๋ณด์ ์ ์ด๋ป๊ฒ ์ด๋ฃจ์ด์ง๋์ง, ๊ทธ๋ฆฌ๊ณ ์์จ๋๋ฅผ ๋ด ๋ง์๋๋ก ์กฐ์ ํ๋ ๋ฐฉ๋ฒ๊น์ง ์์ ์น์ ํ๊ฒ ํ์ด์ค๊ฒ. ์ปคํผ ํ ์ ๋ค๊ณ ํธํ๊ฒ ์ฝ์ด๋ด! โ
ํ์ดํธ๋ฐธ๋ฐ์ค, ์์ด๋ก White Balance, ์ค์ฌ์ WB๋ผ๊ณ ๋ ํด. ์ด๋ฆ๋ง ๋ค์ผ๋ฉด "ํฐ์ ๊ท ํ?" ์ด๊ฒ ๋ญ ์๋ฆฌ์ผ ์ถ์ง? ๊ทผ๋ฐ ์ด๊ฒ ์ง์ง ํต์ฌ์ด์ผ.
์ฝ๊ฒ ๋งํ๋ฉด, ์ด๋ค ์กฐ๋ช ํ๊ฒฝ์์๋ ํฐ ์ข ์ด๋ ํฐ์์ผ๋ก, ๋นจ๊ฐ ์ฌ๊ณผ๋ ๋นจ๊ฐ์์ผ๋ก ๋ณด์ด๊ฒ ๋ง๋๋ ๊ฑฐ์ง.
์ฐ๋ฆฌ ๋์ ์์ฒญ ๋๋ํด์ ํ๊ด๋ฑ ์๋์๋, ์ด๋ถ ์๋์๋ ํฐ ์ข ์ด๋ฅผ "ํฐ์"์ผ๋ก ์ธ์ํด. ์ด๊ฑธ ์์์(Color Adaptation)์ด๋ผ๊ณ ํด. ๊ทผ๋ฐ ์นด๋ฉ๋ผ๋? ์นด๋ฉ๋ผ๋ ๊ทธ๋ฅ ๋น์ ์์ ์๋ ๊ทธ๋๋ก ๋ฐ์๋ค์ฌ. ๊ทธ๋์ ๋ ธ๋ ์กฐ๋ช ์๋์ ์ฐ์ผ๋ฉด ์์ ์ ์ฒด๊ฐ ๋ ธ๋๊ฒ ๋์ค๊ณ , ํ๊ด๋ฑ ์๋์ ์ฐ์ผ๋ฉด ํ๋๊ฑฐ๋ ์ด๋ก๋น์ด ๋๋ ๊ฑฐ์ผ.
์ ๊ทธ๋ฆผ์ฒ๋ผ ์กฐ๋ช ํ๊ฒฝ๋ง๋ค ๋น์ ์์ด ๋ฌ๋ผ์ง๊ณ , ์นด๋ฉ๋ผ๋ ๊ทธ ๋น์ ๊ทธ๋๋ก ๋ด์๋ฒ๋ ค. ๊ทธ๋์ ํ์ดํธ๋ฐธ๋ฐ์ค ๋ณด์ ์ด ํ์ํ ๊ฑฐ์ผ. ์ด๊ฒ ์์ ํ์ง์์ ์ผ๋ง๋ ์ค์ํ์ง, ์ด์ ๊ฐ์ด ์ค์ง? ๐
ํ์ดํธ๋ฐธ๋ฐ์ค๋ฅผ ์ดํดํ๋ ค๋ฉด ์์จ๋๋ฅผ ๋จผ์ ์์์ผ ํด. ์์จ๋๋ ์ผ๋น(K, Kelvin) ๋จ์๋ฅผ ์จ. ์ด๊ฒ ์ข ๋ฐ์ง๊ด์ ์ธ๋ฐ, ์ซ์๊ฐ ๋ฎ์์๋ก ๋ฐ๋ปํ(๋ ธ๋/๋นจ๊ฐ) ์์ด๊ณ , ์ซ์๊ฐ ๋์์๋ก ์ฐจ๊ฐ์ด(ํ๋) ์์ด์ผ.
์ด ์์จ๋ ๊ฐ๋ ์ ๋ฌผ๋ฆฌํ์์ ์์ด. ์ ๋ฅผ ๊ฐ์ดํ๋ฉด ์ฒ์์ ๋นจ๊ฐ๊ฒ ๋ฌ์์ค๋ฅด๋ค๊ฐ ์ ์ ํ์๊ฒ, ๊ทธ๋ฆฌ๊ณ ํ๋๊ฒ ๋ณํ์์? ๊ทธ ์จ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ง๋ ๊ฒ ์์จ๋์ผ. ๊ทธ๋์ ์ญ์ค์ ์ผ๋ก "์ฐจ๊ฐ์ด ํ๋์"์ด ๋์ ์ผ๋น ๊ฐ์ ๊ฐ์ง๋ ๊ฑฐ์ผ. ๐
| ์์จ๋ ๋ฒ์ | ๊ด์ ์ข ๋ฅ | ์๊ฐ ํน์ฑ | ์์ ๋ถ์๊ธฐ |
|---|---|---|---|
| 1000~2000K | ์ด๋ถ, ์ผ์ถ/์ผ๋ชฐ | ๋งค์ฐ ๋ฐ๋ปํ ์ฃผํฉ/๋นจ๊ฐ | ๋ก๋งจํฑ, ๋นํฐ์ง |
| 2500~3200K | ๋ฐฑ์ด๋ฑ, ํ ์คํ ์กฐ๋ช | ๋ฐ๋ปํ ๋ ธ๋๋น | ์๋ํจ, ํด๋์ |
| 3500~4500K | ํ๊ด๋ฑ, ํ ๋ก๊ฒ | ์ค๊ฐ ํฐ๋น | ์ฌ๋ฌด์ , ์ผ์์ |
| 5000~5500K | ๋ง์ ๋ ํ์๊ด | ์์ฐ์ค๋ฌ์ด ํฐ๋น | ์์ฐ์ค๋ฝ๊ณ ์๋๊ฐ |
| 6000~7000K | ํ๋ฆฐ ๋ , ๊ทธ๋ | ์ฝ๊ฐ ์ฐจ๊ฐ์ด ํฐ๋น | ์ฐจ๋ถํจ, ํ๋์ |
| 7000K ์ด์ | ๋ง์ ํ๋, LED ํน์์กฐ๋ช | ํ๋๋น | ์ฐจ๊ฐ๊ณ ๋ฏธ๋์ |
์นด๋ฉ๋ผ์ ์๋ AWB(Auto White Balance, ์๋ ํ์ดํธ๋ฐธ๋ฐ์ค) ๊ธฐ๋ฅ, ๋ค๋ค ํ ๋ฒ์ฏค ์จ๋ดค์ง? ๊ทผ๋ฐ ์ด๊ฒ ์ด๋ป๊ฒ ์๋ํ๋์ง ์์? ์ฌ์ค ๊ฝค ๋ณต์กํ ์๊ณ ๋ฆฌ์ฆ์ด ๋์๊ฐ๊ณ ์์ด. ๊ฐ์ด ํํค์ณ๋ณด์! ๐
"์ถฉ๋ถํ ๋ค์ํ ์์ด ์๋ ์ฅ๋ฉด์์, ๋ชจ๋ ์์ ํ๊ท ์ ํ์(์ค์ฑ)์ด ๋๋ค."
์ฆ, ์์ ์ ์ฒด์ R(๋นจ๊ฐ), G(์ด๋ก), B(ํ๋) ์ฑ๋์ ํ๊ท ๊ฐ์ ๊ณ์ฐํด์, ๊ทธ ํ๊ท ์ด ๋์ผํด์ง๋๋ก ๊ฐ ์ฑ๋์ ์กฐ์ ํ๋ ๊ฑฐ์ผ.
์์์ผ๋ก ๋ณด๋ฉด:
ํ๊ท R๊ฐ = ํ๊ท G๊ฐ = ํ๊ท B๊ฐ ์ด ๋๋๋ก โ ๊ฐ ์ฑ๋์ ๋ณด์ ๊ณ์ ์ ์ฉ
๋จ์ : ๋นจ๊ฐ ์ฅ๋ฏธ๋ฐญ์ด๋ ํ๋ ํ๋๋ง ๊ฐ๋ํ ์ฅ๋ฉด์์๋ ์ค์๋ํ ์ ์์ด.
"์์์์ ๊ฐ์ฅ ๋ฐ์ ํฝ์ ์ด ํฐ์์ด๋ค."
๊ฐ ์ฑ๋(R, G, B)์์ ์ต๋๊ฐ์ ์ฐพ์์, ๊ทธ ์ต๋๊ฐ์ด ๋์ผํด์ง๋๋ก ์กฐ์ ํด. ๋ฐ์ฌ์จ์ด ๋์ ํฐ ๋ฌผ์ฒด๊ฐ ์๋ ์ฅ๋ฉด์์ ์ ์๋ํด.
๋จ์ : ์์์ ํฐ์ ๋ฌผ์ฒด๊ฐ ์๊ฑฐ๋, ๊ฐ์ฅ ๋ฐ์ ๋ถ๋ถ์ด ์กฐ๋ช ์์ฒด์ผ ๊ฒฝ์ฐ ์ค๋ฅ๊ฐ ์๊ฒจ.
์๋ฅผ ๋ค์ด "์ด ์ ๋ถํฌ๋ ํ ์คํ ์กฐ๋ช ์ด 90% ํ๋ฅ "์ด๋ผ๊ณ ํ๋จํ๋ฉด, ๊ทธ์ ๋ง๋ ๋ณด์ ๊ฐ์ ์ ์ฉํ๋ ๊ฑฐ์ผ. ๋ฅ๋ฌ๋ ๊ธฐ๋ฐ AWB๋ ๋ ์ ๊ตํ๊ฒ ์ฅ๋ฉด์ ๋ถ์ํด์ ์ค๋ฅ๋ฅผ ์ค์ฌ.
ํนํ Lab ์ ๊ณต๊ฐ์ a์ถ(๋นจ๊ฐ-์ด๋ก)๊ณผ b์ถ(๋ ธ๋-ํ๋)์ ์กฐ์ ํ๋ฉด ์์จ๋์ ํดํธ๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ์ ์ดํ ์ ์์ด.
์ดฌ์ํ ๋ ํ์ดํธ๋ฐธ๋ฐ์ค๋ฅผ ๋ชป ์ก์๋ค๊ณ ํด์ ๋๋ ๊ฒ ์๋์ผ! ํธ์ง ๋จ๊ณ์์๋ ์ถฉ๋ถํ ๋ณด์ ํ ์ ์์ด. ํนํ RAW ํ์ผ๋ก ์ดฌ์ํ๋ค๋ฉด ๊ฑฐ์ ์๋ฒฝํ๊ฒ ๋ณต๊ตฌ ๊ฐ๋ฅํด. ๐
JPEG/MP4: ์นด๋ฉ๋ผ ๋ด๋ถ์์ ์ด๋ฏธ ํ์ดํธ๋ฐธ๋ฐ์ค ์ฒ๋ฆฌ + ์์ถ์ด ์๋ฃ๋ ์ํ. ํ๋ณด์ ์ ํ์ง ์์ค์ด ์๊ธฐ๊ณ ๋ณด์ ๋ฒ์๋ ์ ํ์ ์ด์ผ.
์์จ๋(Temperature): ์ฌ๋ผ์ด๋๋ฅผ ์ผ์ชฝ(-)์ผ๋ก โ ์ฐจ๊ฐ๊ฒ(ํ๋๊ฒ), ์ค๋ฅธ์ชฝ(+)์ผ๋ก โ ๋ฐ๋ปํ๊ฒ(๋ ธ๋๊ฒ)
ํดํธ(Tint): ์ด๋ก-๋ง์ ํ ์ถ ์กฐ์ . ํ๊ด๋ฑ ์๋์ ์ด๋ก๋น์ด ๋ ๋ ๋ง์ ํ ๋ฐฉํฅ์ผ๋ก ์กฐ์
์คํฌ์ด๋ ๋๊ตฌ: ์์์์ ํฐ์์ด๋ ์ค์ฑ ํ์ ๋ถ๋ถ์ ํด๋ฆญํ๋ฉด ์๋์ผ๋ก WB ๋ณด์ !
๋๋ Color Wheels์ Lift/Gamma/Gain ์กฐ์
Qualifier ๋๊ตฌ: ํน์ ์์ ๋ฒ์๋ง ์ ํํด์ ๋ณด์ ๊ฐ๋ฅ
Color Match ๊ธฐ๋ฅ: ๋ ํผ๋ฐ์ค ์์์ ์๊ฐ์ ์๋์ผ๋ก ๋งค์นญํด์ฃผ๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ!
Curves - Custom Curves: R, G, B ์ฑ๋์ ๊ฐ๋ณ์ ์ผ๋ก ์ปค๋ธ ์กฐ์
๋๋ Color Board / Color Wheels์์ ์๋ ์กฐ์
White Balance ์คํฌ์ด๋: ํฐ์ ์์ญ ํด๋ฆญ์ผ๋ก ์๋ ๋ณด์
Color Curves: ์ฑ๋๋ณ ์ธ๋ฐํ ์กฐ์ ๊ฐ๋ฅ
Temp(์์จ๋)์ Tint(ํดํธ) ์ฌ๋ผ์ด๋๋ก ์ง๊ด์ ์กฐ์
WB ํ๋ฆฌ์ : ์๋, ํ์๊ด, ํ๋ฆผ, ๊ทธ๋, ํ ์คํ , ํ๊ด๋ฑ, ํ๋์ ๋ฑ ์ ํ ๊ฐ๋ฅ
RAW ํ์ผ์์๋ ์์ ๋นํ๊ดด ํธ์ง!
๊ฐ์ฅ ๋น ๋ฅด๊ณ ์ ํํ ํ์ดํธ๋ฐธ๋ฐ์ค ๋ณด์ ๋ฐฉ๋ฒ ์ค ํ๋๊ฐ ๋ฐ๋ก ์คํฌ์ด๋ ๋๊ตฌ์ผ. ์ฌ์ฉ๋ฒ์ ๊ฐ๋จํด:
์ด์ ์ข ๋ ๊น์ด ๋ค์ด๊ฐ๋ณผ๊ฒ. ์์จ๋ ์กฐ์ ์ด ์ค์ ๋ก ์ด๋ป๊ฒ ์ด๋ฃจ์ด์ง๋์ง ๊ธฐ์ ์ ์ผ๋ก ํํค์ณ๋ณด์. ์ด๋ ต์ง ์์, ๊ฐ์ด ๊ฐ๋ณด์! ๐ช
์์จ๋ ์กฐ์ ์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์๋ฆฌ๋ RGB ์ฑ๋์ ๊ฒ์ธ(Gain) ๊ฐ์ ์กฐ์ ํ๋ ๊ฑฐ์ผ.
๐ต ํ๋(B) ์ฑ๋ ๊ฒ์ธ ์ฆ๊ฐ + ๐ด ๋นจ๊ฐ(R) ์ฑ๋ ๊ฒ์ธ ๊ฐ์ โ ์์จ๋ ๋์์ง (์ฐจ๊ฐ์์ง)
์์์ผ๋ก ํํํ๋ฉด ์ด๋ ๊ฒ ๋ผ:
๋ณด์ ๋ R = ์๋ณธ R ร Kr
๋ณด์ ๋ G = ์๋ณธ G ร Kg
๋ณด์ ๋ B = ์๋ณธ B ร Kb
(Kr, Kg, Kb๋ ๊ฐ ์ฑ๋์ ๋ณด์ ๊ณ์)
์์: ํ
์คํ
์กฐ๋ช
(3200K) โ ์์ฐ๊ด(5500K)์ผ๋ก ๋ณด์ ์
Kr โ 0.85 (๋นจ๊ฐ ์ฝ๊ฐ ๊ฐ์)
Kg โ 1.00 (์ด๋ก ์ ์ง)
Kb โ 1.35 (ํ๋ ์ฆ๊ฐ)
์ ๋ฌธ์ ์ธ ํ์ดํธ๋ฐธ๋ฐ์ค ๋ณด์ ์ ๋จ์ํ RGB ์กฐ์ ์ ๋์ด์ ์ ๊ณต๊ฐ ๋ณํ์ ํ์ฉํด:
| ์ ๊ณต๊ฐ | ํน์ง | WB ๋ณด์ ์์์ ํ์ฉ |
|---|---|---|
| RGB | ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์ ๊ณต๊ฐ | ์ฑ๋๋ณ ๊ฒ์ธ ์กฐ์ ์ผ๋ก WB ๋ณด์ |
| XYZ | ์ธ๊ฐ ์๊ฐ ๊ธฐ๋ฐ์ ํ์ค ์ ๊ณต๊ฐ | ํฌ๋ก๋งคํฑ ์ด๋ํ ์ด์ ๋ณํ(CAT)์ ์ฌ์ฉ |
| Lab | ์ง๊ฐ์ ์ผ๋ก ๊ท ์ผํ ์ ๊ณต๊ฐ | a(๋นจ๊ฐ-์ด๋ก), b(๋ ธ๋-ํ๋) ์ถ ์กฐ์ |
| HSL/HSV | ์์กฐ/์ฑ๋/๋ช ๋ ๋ถ๋ฆฌ | ํน์ ์์กฐ๋ง ์ ํ์ ์ผ๋ก ๋ณด์ |
| YCbCr | ์์ ์์ถ์ ์ฃผ๋ก ์ฌ์ฉ | Cb(ํ๋ ์ฐจ์ด), Cr(๋นจ๊ฐ ์ฐจ์ด) ์กฐ์ |
๊ณ ๊ธ ํ์ดํธ๋ฐธ๋ฐ์ค ๋ณด์ ์์๋ ํฌ๋ก๋งคํฑ ์ด๋ํ ์ด์ ๋ณํ(Chromatic Adaptation Transform, CAT)์ ์ฌ์ฉํด. ์ด๊ฑด ์ธ๊ฐ์ ๋์ด ๋ค๋ฅธ ์กฐ๋ช ํ๊ฒฝ์ ์ ์ํ๋ ๋ฐฉ์์ ์ํ์ ์ผ๋ก ๋ชจ๋ธ๋งํ ๊ฑฐ์ผ.
2. ๋ชฉํ ์กฐ๋ช ์ ์์จ๋(์: 6500K D65 ํ์ค๊ด)์ ํ์ดํธ ํฌ์ธํธ ์ค์
3. ๋ ํ์ดํธ ํฌ์ธํธ ์ฌ์ด์ ๋ณํ ํ๋ ฌ ๊ณ์ฐ
4. ๋ชจ๋ ํฝ์ ์ ๋ณํ ํ๋ ฌ ์ ์ฉ
๋ํ์ ์ธ CAT ๋ฐฉ๋ฒ:
- Von Kries ๋ณํ: ๊ฐ์ฅ ๋จ์ํ๊ณ ๋น ๋ฆ
- Bradford ๋ณํ: ๋ ์ ํํ ์ ์ฌํ
- CIECAM02: ํ์ฌ ๊ฐ์ฅ ์ ๊ตํ ๋ฐฉ๋ฒ
์ด์ ์ง์ง ์ค์ฉ์ ์ธ ๋ถ๋ถ์ด์ผ. ์์ ๋ณํ(ํธ๋์ค์ฝ๋ฉ) ์์ ์์ ํ์ดํธ๋ฐธ๋ฐ์ค๋ฅผ ์๋์ผ๋ก ๋ณด์ ํ๋ ๋ฐฉ๋ฒ๋ค์ ์์๋ณด์. ํนํ ๋๋์ ์์์ ์ฒ๋ฆฌํด์ผ ํ ๋ ์ ์ฉํ ๋ฐฉ๋ฒ๋ค์ด์ผ! ๐
FFmpeg์ ๋ฌด๋ฃ ์คํ์์ค ์์ ์ฒ๋ฆฌ ๋๊ตฌ์ธ๋ฐ, ํ์ดํธ๋ฐธ๋ฐ์ค ๋ณด์ ๋ ๊ฐ๋ฅํด:
# ๊ธฐ๋ณธ ์์จ๋ ์กฐ์ (curves ํํฐ ์ฌ์ฉ)
ffmpeg -i input.mp4 -vf "curves=r='0/0 0.5/0.4 1/0.9':b='0/0 0.5/0.6 1/1.1'" output.mp4
# colorbalance ํํฐ๋ก ์ ๊ท ํ ์กฐ์
ffmpeg -i input.mp4 -vf "colorbalance=rs=0.1:gs=0:bs=-0.1" output.mp4
# colortemperature ํํฐ (FFmpeg 5.0 ์ด์)
ffmpeg -i input.mp4 -vf "colortemperature=temperature=6500" output.mp4
# hue/saturation ์กฐ์ ๊ณผ ํจ๊ป ์ฌ์ฉ
ffmpeg -i input.mp4 -vf "colorbalance=rs=-0.1:bs=0.1,hue=s=1.1" output.mp4
ํ๋ก๊ทธ๋๋ฐ์ผ๋ก ์๋ํํ๊ณ ์ถ๋ค๋ฉด Python๊ณผ OpenCV ์กฐํฉ์ด ์ต๊ณ ์ผ:
import cv2
import numpy as np
def gray_world_wb(image):
"""๊ทธ๋ ์ด ์๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํ์ดํธ๋ฐธ๋ฐ์ค ๋ณด์ """
# ๊ฐ ์ฑ๋์ ํ๊ท ๊ณ์ฐ
b_mean = np.mean(image[:,:,0])
g_mean = np.mean(image[:,:,1])
r_mean = np.mean(image[:,:,2])
# ์ ์ฒด ํ๊ท
overall_mean = (b_mean + g_mean + r_mean) / 3
# ๋ณด์ ๊ณ์ ๊ณ์ฐ
b_scale = overall_mean / b_mean
g_scale = overall_mean / g_mean
r_scale = overall_mean / r_mean
# ๋ณด์ ์ ์ฉ
result = image.copy().astype(np.float32)
result[:,:,0] = np.clip(result[:,:,0] * b_scale, 0, 255)
result[:,:,1] = np.clip(result[:,:,1] * g_scale, 0, 255)
result[:,:,2] = np.clip(result[:,:,2] * r_scale, 0, 255)
return result.astype(np.uint8)
def adjust_color_temperature(image, temperature):
"""์์จ๋ ์กฐ์ ํจ์ (์ผ๋น ๊ฐ ๊ธฐ๋ฐ)"""
# ์ผ๋น ๊ฐ์ RGB ๊ฒ์ธ์ผ๋ก ๋ณํ
if temperature < 5500: # ๋ฐ๋ปํ๊ฒ
r_gain = 1.0 + (5500 - temperature) / 5500 * 0.3
b_gain = 1.0 - (5500 - temperature) / 5500 * 0.3
else: # ์ฐจ๊ฐ๊ฒ
r_gain = 1.0 - (temperature - 5500) / 5500 * 0.3
b_gain = 1.0 + (temperature - 5500) / 5500 * 0.3
result = image.copy().astype(np.float32)
result[:,:,2] = np.clip(result[:,:,2] * r_gain, 0, 255) # R
result[:,:,0] = np.clip(result[:,:,0] * b_gain, 0, 255) # B
return result.astype(np.uint8)
# ์์ ํ์ผ์ ์ ์ฉ
cap = cv2.VideoCapture('input.mp4')
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
fps = cap.get(cv2.CAP_PROP_FPS)
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
out = cv2.VideoWriter('output.mp4', fourcc, fps, (width, height))
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
corrected = gray_world_wb(frame)
out.write(corrected)
cap.release()
out.release()
์ต๊ทผ์๋ ๋ฅ๋ฌ๋์ ํ์ฉํ ๋ ์ ๊ตํ ์๋ WB ๋ณด์ ๊ธฐ์ ๋ค์ด ๋์ค๊ณ ์์ด:
Semantic Segmentation ํ์ฉ: ์์์์ ํ๋, ํผ๋ถ, ์๋ฌผ ๋ฑ ์๋ฏธ ์๋ ์์ญ์ ์ธ์ํ๊ณ , ๊ฐ ์์ญ์ ์ ํน์ฑ์ ํ์ฉํด์ ๋ ์ ํํ WB๋ฅผ ์ถ์ ํด.
์๊ฐ์ ์ผ๊ด์ฑ(Temporal Consistency): ์์์์ ํ๋ ์ ๊ฐ ์ ๋ณํ๊ฐ ์์ฐ์ค๋ฝ๋๋ก ์๊ฐ ์ถ์ ๊ณ ๋ คํ ๋ณด์ . ๊ฐ์์ค๋ฌ์ด ์ ๋ณํ(flickering)๋ฅผ ๋ฐฉ์งํด.
๋ํ์ ์ธ ์คํ์์ค ๋ชจ๋ธ: Deep White-Balance Editing (CVPR 2020), C5 (CVPR 2021) ๋ฑ
์ด์ ๊ธฐ์ ์ ์ธ ๋ถ๋ถ์ ์ถฉ๋ถํ ๋ค๋ค์ผ๋, ์ฐฝ์์ ์ธ ํ์ฉ๋ฒ์ ์์๋ณด์! ์์จ๋๋ ๋จ์ํ "์ ํํ ์"์ ๋ง๋๋ ๋๊ตฌ๊ฐ ์๋๋ผ, ๊ฐ๋ ฅํ ๊ฐ์ ์ฐ์ถ ๋๊ตฌ์ผ. ๐จ
ํ์ค ์ธ๊ณ: ํ๋๋น ์ฐจ๊ฐ์ด ์์กฐ
โ ๋ ์ธ๊ณ๋ฅผ ์์ผ๋ก ๋ช ํํ ๊ตฌ๋ถํ๋ ์ฒ์ฌ์ ์ธ ์ฐ์ถ!
ํ์ค ์ฅ๋ฉด: ์๋์ ์ผ๋ก ์ค์ฑ์ ์ธ ์์กฐ
โ ๊ฟ๊ณผ ํ์ค์ ๊ฒฝ๊ณ๋ฅผ ์์จ๋๋ก ํํ
์ฌ๋ง ์ฅ๋ฉด: ๋ฐ๋ปํ ์ฃผํฉ/๋ ธ๋ ์์กฐ
โ ํ๊ฒฝ์ ๋ฐ๋ฅธ ๊ทน์ ์ธ ์์จ๋ ๋๋น๋ก ์ธ๊ณ๊ด ๊ตฌ์ถ
์, ์ด์ ์ค์ ๋ก ์ด๋ป๊ฒ ์์ ํ๋์ง ๋จ๊ณ๋ณ๋ก ์์๋ณด์. ์์ ๋ณํ ์์ ์์ ํ์ดํธ๋ฐธ๋ฐ์ค ๋ณด์ ์ ํฌํจํ ์์ ํ ์ํฌํ๋ก์ฐ์ผ! ๐ ๏ธ
| ์ค์ฝํ ์ข ๋ฅ | ๋ณด๋ ๊ฒ | WB ๋ณด์ ์์์ ํ์ฉ |
|---|---|---|
| ์จ์ด๋ธํผ | ๋ฐ๊ธฐ ๋ถํฌ (Y์ถ) | ๋ ธ์ถ ํ์ธ, ํด๋ฆฌํ ๋ฐฉ์ง |
| RGB ํผ๋ ์ด๋ | R, G, B ์ฑ๋๋ณ ๋ฐ๊ธฐ | ์ธ ์ฑ๋์ด ๊ท ํ ์กํ ์์ผ๋ฉด WB OK |
| ๋ฒกํฐ์ค์ฝํ | ์์๊ณผ ์ฑ๋ ๋ถํฌ | ์ค์ฌ์ ๊ฐ๊น์ธ์๋ก ์ค์ฑ์ ์ธ ์ |
| ํ์คํ ๊ทธ๋จ | ์ ์ฒด ๋ฐ๊ธฐ ๋ถํฌ | ๋ ธ์ถ ๊ณผ๋ค/๋ถ์กฑ ํ์ธ |
์์ฆ์ ์ค๋งํธํฐ์ผ๋ก๋ ์์ฒญ๋ ํ๋ฆฌํฐ์ ์์์ ์ฐ์์. ์ค๋งํธํฐ ์์์ ํ์ดํธ๋ฐธ๋ฐ์ค ๋ณด์ ์ ๋ํด์๋ ์์๋ณด์! ๐ฑ
Filmic Pro์์๋ ์ผ๋น ๊ฐ์ผ๋ก ์ง์ ์์จ๋๋ฅผ ์ค์ ํ ์ ์์ด. 2000K~8000K ๋ฒ์์์ ์กฐ์ ๊ฐ๋ฅ!
๊ตฌ๊ธ ํฝ์ ์ ๊ธฐ๋ณธ ์ฑ์์ AWB๋ง ์ง์ํ์ง๋ง, Open Camera ๊ฐ์ ์ฑ์ผ๋ก ์๋ ์ค์ ๊ฐ๋ฅํด.
| ์ฑ ์ด๋ฆ | ํ๋ซํผ | WB ๋ณด์ ๊ธฐ๋ฅ | ํน์ง |
|---|---|---|---|
| LumaFusion | iOS | ์์จ๋/ํดํธ ์ฌ๋ผ์ด๋ | ์ ๋ฌธ๊ฐ๊ธ ๋ชจ๋ฐ์ผ ํธ์ง |
| CapCut | iOS/Android | ์์จ๋ ์ฌ๋ผ์ด๋ | ๋ฌด๋ฃ, ์ง๊ด์ UI |
| Adobe Premiere Rush | iOS/Android | ์์จ๋/ํดํธ ์กฐ์ | Premiere์ ์ฐ๋ |
| VSCO | iOS/Android | ์์จ๋ ์กฐ์ | ํ๋ฆ ๋๋ ํ๋ฆฌ์ |
| DaVinci Resolve | iOS/Android | ์ ๋ฌธ๊ฐ๊ธ ์๋ณด์ | ๋ฐ์คํฌํฑ ๋ฒ์ ๊ณผ ๋์ผ |
์ค์ ์ดฌ์ ํ์ฅ์์ ๊ฐ์ฅ ๊ณจ์น ์ํ ์ํฉ์ด ๋ฐ๋ก ํผํฉ ์กฐ๋ช (Mixed Lighting)์ด์ผ. ์ฐฝ๋ฌธ์ผ๋ก ์์ฐ๊ด์ด ๋ค์ด์ค๋๋ฐ ์ค๋ด์๋ ํ ์คํ ์กฐ๋ช ์ด ์ผ์ ธ ์๋ ์ํฉ ๊ฐ์ ๊ฑฐ. ์ด๋ด ๋ ์ด๋ป๊ฒ ํด์ผ ํ ๊น? ๐ค
์ฃผ ๊ด์ ํต์ผ: ๊ฐ๋ฅํ๋ฉด ์ฐฝ๋ฌธ์ ๋ง๊ฑฐ๋ ์ธ๊ณต์กฐ๋ช ์ ๋๊ณ ํ๋์ ๊ด์์ผ๋ก ํต์ผํด.
LED ์กฐ๋ช ํ์ฉ: ์์จ๋ ์กฐ์ ์ด ๊ฐ๋ฅํ ๋ฐ์ด์ปฌ๋ฌ LED ์กฐ๋ช ์ ์ฌ์ฉํ๋ฉด ํ๊ฒฝ์ ๋ง๊ฒ ์์จ๋๋ฅผ ๋ง์ถ ์ ์์ด.
DaVinci Resolve์ Qualifier: ํน์ ์์ ๋ฒ์๋ฅผ ์ ํํด์ ๊ทธ ์์ญ๋ง WB ๋ณด์ ๊ฐ๋ฅ. ์๋ฅผ ๋ค์ด ๋ ธ๋๋น์ด ๋๋ ์์ญ๋ง ์ ํํด์ ์ฐจ๊ฐ๊ฒ ๋ณด์ .
์ค๊ฐ๊ฐ ํํ: ๋ ๊ด์์ ์ค๊ฐ ์์จ๋๋ก WB๋ฅผ ๋ง์ถ๊ณ , ์์ชฝ ๋ชจ๋ ์ฝ๊ฐ์ฉ ๋ถ์์ฐ์ค๋ฝ์ง๋ง ์ ์ฒด์ ์ผ๋ก ๊ท ํ ์กํ ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ค์ด.
ํ์ดํธ๋ฐธ๋ฐ์ค ๋ณด์ ์์ ์์จ๋(๋ฐ๋ปํจ-์ฐจ๊ฐ์)๋งํผ ์ค์ํ ๊ฒ ๋ฐ๋ก ํดํธ(Tint)์ผ. ํดํธ๋ ์ด๋ก-๋ง์ ํ ์ถ์ ์กฐ์ ํ๋ ๊ฑฐ์ผ.
LED ์กฐ๋ช : ์ข ๋ฅ์ ๋ฐ๋ผ ์ด๋ก ๋๋ ๋ง์ ํ ์บ์คํธ๊ฐ ์๊ธธ ์ ์์ด
ํผํฉ ์กฐ๋ช : ์์จ๋ ๋ณด์ ํ์๋ ์์ด ์ด์ํ๋ฉด ํดํธ๋ฅผ ํ์ธํด๋ด
์์จ๋์ ํดํธ๋ฅผ ํจ๊ป ์กฐ์ ํด์ผ ์๋ฒฝํ ํ์ดํธ๋ฐธ๋ฐ์ค๊ฐ ๋์!
ํ์ดํธ๋ฐธ๋ฐ์ค ๋ณด์ ํ๋ค๊ฐ ๋ง์ด๋ค ํ๋ ์ค์๋ค์ ์ ๋ฆฌํด๋ดค์ด. ์ด๊ฑฐ ์๋ฉด ์ํ์ฐฉ์ค๋ฅผ ์์ฒญ ์ค์ผ ์ ์์ด! ๐
2. ๋ณด์ ์ ๋จ๊ณ์ ์ผ๋ก, ๊ณผ๋ํ์ง ์๊ฒ
3. ์์ ์ดฌ์ ์ ์๋ WB ์ค์
4. ์คํฌ์ด๋๋ ๋ฐ๋์ ์ค์ฑ ์ ์์ญ์ ์ฌ์ฉ
5. RAW/Log ํฌ๋งท์ผ๋ก ์ดฌ์ํด์ ํ๋ณด์ ์ฌ์ ํ๋ณด
๋ง์ง๋ง์ผ๋ก ํ์ดํธ๋ฐธ๋ฐ์ค ๋ณด์ ์ ๋ฏธ๋๋ฅผ ์ด์ง ๋ค์ฌ๋ค๋ณด์. ๊ธฐ์ ์ด ์์ฒญ๋๊ฒ ๋น ๋ฅด๊ฒ ๋ฐ์ ํ๊ณ ์์ด! ๐
์, ์ฌ๊ธฐ๊น์ง ์ฝ์ด์คฌ์ด? ์ง์ง ๊ณ ๋ง์! ๐ ๋ง์ง๋ง์ผ๋ก ์ค๋ ๋ฐฐ์ด ๋ด์ฉ์ ๊น๋ํ๊ฒ ์ ๋ฆฌํด๋ณผ๊ฒ.
AWB ์๋ ํ์ดํธ๋ฐธ๋ฐ์ค. ํธ๋ฆฌํ์ง๋ง ์์ ์ดฌ์์์๋ ์ฃผ์ ํ์
๊ทธ๋ ์ด ์๋ ์ ์ฒด ํ๊ท ์ด ํ์์ด ๋๋๋ก ๋ณด์ ํ๋ ์๊ณ ๋ฆฌ์ฆ
RAW ์ดฌ์ ํ๋ณด์ ์์ ๋ ์ต๋ํ. ํ์ดํธ๋ฐธ๋ฐ์ค ์์ ๋ณต๊ตฌ ๊ฐ๋ฅ
์คํฌ์ด๋ ๋๊ตฌ ํฐ์/ํ์ ์์ญ ํด๋ฆญ์ผ๋ก ๋น ๋ฅธ WB ๋ณด์
ํดํธ ์์จ๋์ ํจ๊ป ์กฐ์ ํด์ผ ์๋ฒฝํ WB ๋ฌ์ฑ
RGB ํผ๋ ์ด๋ ๊ฐ๊ด์ ์ธ WB ํ์ธ ๋๊ตฌ. ๋๋ณด๋ค ์ค์ฝํ๋ฅผ ๋ฏฟ์ด!
์ฐฝ์์ ํ์ฉ ์์จ๋๋ ๊ฐ์ ์ฐ์ถ์ ๊ฐ๋ ฅํ ๋๊ตฌ
ํ์ดํธ๋ฐธ๋ฐ์ค๋ ์ฒ์์ ๋ณต์กํด ๋ณด์ด์ง๋ง, ์๋ฆฌ๋ฅผ ์ดํดํ๊ณ ๋๋ฉด ์์ ํ๋ฆฌํฐ๋ฅผ ํ ๋จ๊ณ ์ฌ๋ ค์ฃผ๋ ํต์ฌ ๊ธฐ์ ์ด์ผ. ์์จ๋ ํ๋๋ง ์ ์ก์๋ ์์์ด ์์ ํ ๋ฌ๋ผ ๋ณด์ด๊ฑฐ๋ . ์ค๋๋ถํฐ ์ดฌ์ํ ๋ AWB ๋์ ์๋ WB์ ๋์ ํด๋ด! ์ฒ์์ ์ด์ํด๋ ๊ธ๋ฐฉ ์ต์ํด์ง ๊ฑฐ์ผ. ๐ช
๐ฌ ์ข์ ์์์ ์ข์ ์์์ ์์๋๋ค! ๐ฌ
์ค๋๋ ๋ฉ์ง ์์ ๋ง๋ค์ด๋ด. ํ์ดํ ! ๐
๊ด๋ จ ํค์๋
๋๊ธ ์์ฑ
์ด ๊ธ์ ๋ํ ์ฌ๋ฌ๋ถ์ ์๊ฐ์ ๋ค๋ ค์ฃผ์ธ์
๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค
๋๊ธ์ ์์ฑํ๋ ค๋ฉด ๋จผ์ ๋ก๊ทธ์ธํด์ฃผ์ธ์.
๋๊ธ 0
์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์์ง ๋๊ธ์ด ์์ต๋๋ค.