노이즈 제거, 디블로킹, 샤프닝, 색 보정: 영상 복원 필터 심화
노이즈 제거, 디블로킹, 밴딩 제거, 샤프닝, 화이트 밸런스, 색수차 보정이 작동하는 원리와 적용 순서를 FFmpeg 테스트 결과와 함께 정리했습니다.
핵심 요약
영상 복원 필터는 각각 한 가지 손상을 고치며, 어떤 순서로 돌리느냐에 따라 서로 돕기도 하고 싸우기도 합니다. 먼저 디인터레이스하고, 소스 크기에서 디블로킹과 노이즈 제거를 하고, 색을 보정한 뒤 스케일링하고, 샤프닝은 가볍게, 디더나 그레인은 마지막에 더하세요. 노이즈를 샤프닝하거나 방금 더한 그레인을 노이즈 제거로 지우면 작업이 도로 무너집니다.
- 복원 필터는 저마다 한 가지 손상을 겨냥합니다. 노이즈, 압축 블록, 밴딩, 흐릿함, 색 틀어짐, 색 번짐입니다. 필터를 고르기 전에 손상이 무엇인지부터 짚으세요.
- 순서가 중요합니다. 디인터레이스, 디블로킹, 노이즈 제거는 소스 크기에서 하고, 색을 고친 뒤 스케일링하고, 샤프닝은 가볍게, 디더나 그레인은 마지막에 더합니다.
- 노이즈 제거 필터는 저마다 다른 방식으로 노이즈와 질감을 맞바꿉니다. 테스트에서 비국소 평균은 평평한 하늘의 노이즈를 거의 다 지웠지만 나뭇잎의 노이즈는 남겼고, 더 세게 걸자 잎 디테일의 17%를 지웠습니다.
- 샤프닝은 이미 있는 가장자리를 가파르게 만들 뿐이며, 무리하면 헤일로가 생깁니다. 디테일을 더하지는 못합니다.
- '색 오류'라고 불리는 문제는 두 가지입니다. 화이트 밸런스로 고치는 색 틀어짐, 그리고 빨강과 파랑 채널을 다시 맞춰 고치는 색수차입니다.
각 복원이 고치는 것
복원은 진단에서 시작합니다. 아래 표는 흔한 손상 유형, 알아보는 방법, 유형별로 테스트한 필터를 정리한 것입니다. 그레인과 노이즈, 압축을 구별하기 어렵다면 먼저 그레인 vs 노이즈 vs 압축 아티팩트를 보세요.
| 손상 | 보이는 현상 | 복원 | 테스트한 FFmpeg 필터 |
|---|---|---|---|
| 센서 노이즈 | 프레임마다 바뀌는 자글자글한 점, 어두운 부분에서 가장 심함 | 노이즈 제거 | hqdn3d, atadenoise, nlmeans, fftdnoiz, bm3d |
| 압축 블록 | 그라데이션과 움직이는 부분에 생기는 사각형 격자 | 디블로킹 | deblock, spp, pp7, fspp, uspp |
| 링잉과 모스키토 노이즈 | 가장자리와 글자 주변을 기어다니는 점과 물결 | 디링잉(소프트 임계값) 또는 노이즈 제거 | spp의 mode=soft, nlmeans |
| 밴딩 | 하늘, 벽, 페이드에 보이는 계단 | 밴딩 제거 후 10비트 인코딩 | deband, gradfun |
| 흐릿함 | 가장자리에 힘이 없음 | 샤프닝, 또는 모델로 업스케일링 | unsharp, cas |
| 색 틀어짐 | 흰색이 주황, 파랑, 초록빛으로 보임 | 화이트 밸런스 | colorchannelmixer, grayworld, greyedge |
| 배율 색수차 | 화면 가장자리로 갈수록 커지는 빨강–청록 또는 파랑–노랑 테두리 | 빨강·파랑 채널 스케일링 | 분리한 평면에 perspective |
| 빗살 | 움직이는 가장자리의 빗살 모양 선 | 디인터레이스 | bwdif |
순서가 중요한 이유
각 단계는 다음 단계가 보는 화면을 바꿉니다. 그래서 엉뚱한 자리에 놓인 필터는 앞 단계의 작업을 되돌리거나, 없애야 할 손상을 오히려 키울 수 있습니다.

- 디인터레이스를 먼저 합니다. 다른 필터는 모두 완전한 프레임을 가정합니다. 인터레이스 필드에서는 노이즈 제거 필터가 빗살을 질감으로 여기고, 스케일러가 이를 번지게 해 고스팅을 만듭니다. 영상 디인터레이스 방법을 참고하세요.
- 픽셀을 옮기는 작업 전에 디블로킹합니다. 디블로킹 필터는 인코더의 블록 격자를 기준으로 작동하는데, 노이즈 제거와 스케일링은 이 격자를 흐리고 밀어 냅니다.
- 샤프닝이나 색보정 전에 노이즈를 제거합니다. 샤프닝과 대비 증가는 디테일과 함께 노이즈도 키웁니다.
- 샤프닝 전에 색을 고칩니다. 가장자리가 아직 부드러울 때 색 틀어짐을 고치고 색 채널을 다시 맞추세요. 샤프닝을 먼저 하면 색 테두리까지 또렷해집니다.
- 스케일링은 한 번만, 깨끗해진 프레임에서 합니다. 그래야 남은 손상이 확대되지 않습니다.
- 샤프닝은 출력 크기에서, 가볍게 합니다.
- 디더와 그레인은 마지막에 더합니다. 그 뒤에 매끄럽게 하는 단계가 있으면 밴딩이나 밀랍 같은 느낌을 가려 주던 미세 노이즈가 지워집니다.
- 충분한 비트로 인코딩합니다. 10비트로 인코딩해야 매끄러운 그라데이션에 밴딩이 다시 생기지 않습니다.
미세 질감에 노이즈를 더한 합성 클립으로 노이즈 제거와 샤프닝의 순서를 확인했습니다. 샤프닝 후 노이즈를 제거하면 평평한 부분에 노이즈가 더 남았고(자체 측정값 14.5, 반대 순서는 12.2), 깨끗한 클립 대비 PSNR은 26.6 dB로 반대 순서의 27.7 dB보다 낮았습니다. 노이즈 제거만 했을 때는 30.3 dB에 8.0이 남았습니다. 어떤 샤프닝이든 깨끗함을 조금은 깎아 먹으니, 영상에 필요한 만큼만 쓰세요.
노이즈 제거: 다섯 가지 필터 계열
노이즈는 프레임마다 바뀌는 무작위 변동이고, 디테일은 제자리에 있거나 장면과 함께 움직이는 구조입니다. 모든 노이즈 제거 필터는 저마다의 방식으로 이 차이를 이용합니다.
- 공간 필터는 같은 프레임 안에서 각 픽셀을 이웃 픽셀과 평균합니다. 빠르지만 같은 크기의 미세 질감과 노이즈를 구별하지 못해 둘 다 흐려집니다.
- 시간 필터는 이웃 프레임에 걸쳐 같은 픽셀을 평균합니다. 정지한 디테일은 반복되므로 살아남고 노이즈는 평균되어 사라집니다. 움직이는 것은 필터가 움직임을 감지하거나 먼저 프레임을 정렬하지 않는 한 꼬리 잔상으로 번집니다. 이 문제는 시간적 일관성, 깜빡임, 잔상에서 다룹니다. FFmpeg의
atadenoise는 적응형 시간 평균이고,hqdn3d는 가벼운 공간 처리와 시간 처리를 결합합니다. - 비국소 평균은 각 픽셀을, 탐색 창 안 어디에 있든 주변 패치가 비슷해 보이는 픽셀들의 평균으로 바꿉니다. 저자들의 말대로 가장 비슷한 픽셀이 가까이 있을 필요는 없습니다. 하늘이나 벽처럼 반복되는 영역에서는 일치하는 패치가 많고, 고유한 질감에서는 적습니다.
- 변환 영역 필터는 화면의 블록을 주파수 표현으로 옮깁니다. 거기서 실제 구조는 소수의 강한 계수에 모이고 노이즈는 모든 계수에 옅게 퍼지므로, 약한 계수를 줄입니다.
fftdnoiz는 이웃 프레임까지 포함할 수 있는 3D FFT로 이를 수행합니다. BM3D는 먼저 비슷한 2D 패치를 3D 묶음으로 모아 표현을 더 희소하게 만듭니다. - 학습형 노이즈 제거는 깨끗한 이미지와 노이즈 낀 이미지 쌍으로 네트워크를 학습시킵니다. DnCNN은 노이즈 자체를 예측하도록 학습하고(잔차 학습), FFDNet은 노이즈 레벨 맵을 추가 입력으로 받아 모델 하나로 서로 다르고 고르지 않은 노이즈 레벨을 처리하며, FastDVDnet은 여러 프레임을 한꺼번에 쓰면서 비용이 큰 움직임 보상 단계를 피합니다.
테스트 결과
파란 하늘을 배경으로 햇빛 받은 나뭇잎이 나오는 1080p 샘플 클립 30프레임에 휘도 기준 255단계 중 약 8단계 크기의, 프레임마다 바뀌는 가우시안 노이즈를 더했습니다. 그리고 노트북 CPU(Intel Core i7-1360P)에서 FFmpeg 노이즈 제거 필터를 돌려 각 결과를 깨끗한 클립과 비교했습니다.
| 필터와 설정 | 계열 | 30프레임 처리 시간 | PSNR(휘도) | 평평한 하늘에 남은 오차 | 나뭇잎의 오차 | 잎 디테일 보존율 |
|---|---|---|---|---|---|---|
| 없음(노이즈 낀 입력) | 기준 | 해당 없음 | 30.3 dB | 8.8 | 8.9 | 99% |
hqdn3d(기본값) | 공간 + 시간 | 1.0초 | 30.7 dB | 8.1 | 8.7 | 99% |
hqdn3d=8:6:12:9 | 공간 + 시간 | 0.8초 | 31.5 dB | 6.1 | 8.0 | 97% |
atadenoise(임계값 0.1과 0.2) | 시간 | 0.9초 | 31.1 dB | 4.9 | 8.5 | 94% |
nlmeans=s=6 | 비국소 평균 | 31.7초 | 32.2 dB | 1.1 | 8.1 | 98% |
nlmeans=s=10 | 비국소 평균 | 31.8초 | 31.0 dB | 1.0 | 8.9 | 83% |
fftdnoiz=sigma=8:prev=1:next=1 | 변환 영역, 3프레임 | 3.8초 | 33.7 dB | 4.3 | 6.4 | 98% |
bm3d=sigma=30 | 변환 영역 | 8.1초 | 34.0 dB | 1.3 | 6.2 | 91% |
'오차'는 깨끗한 클립과의 차이의 표준편차이므로, 나뭇잎에서는 남은 노이즈와 잃어버린 질감이 함께 계산됩니다. '잎 디테일 보존율'은 깨끗한 클립의 미세한 잎 질감이 결과에 얼마나 남아 있는지를 나타냅니다.

숫자가 말해 주는 것은 다음과 같습니다.
- 빠른 필터는 강한 노이즈를 거의 줄이지 못합니다. 기본값
hqdn3d는 하늘 오차를 8.8에서 8.1로 낮췄을 뿐입니다. 가벼운 노이즈나 더 강한 필터 앞의 1차 처리에 알맞습니다. - 비국소 평균은 원래 고르지 않습니다.
s=6에서는 하늘을 1.1까지 깨끗하게 했지만 나뭇잎은 거의 그대로(8.1) 남겼습니다. 고유한 질감에는 평균할 비슷한 패치가 적기 때문입니다.s=10에서는 잎이 실제 디테일의 17%를 잃고 PSNR도 떨어졌습니다. AI 복원 영상이 플라스틱처럼 보이는 이유에서 설명한 밀랍 같은 느낌이 바로 이것입니다. - 변환 영역 필터는 둘 사이의 균형을 잡았습니다. 앞뒤로 한 프레임씩 쓰는
fftdnoiz는 33.7 dB에서 잎 디테일의 98%를 지켰습니다.bm3d는 PSNR 34.0 dB로 점수가 가장 높았지만, 그 과정에서 잎 디테일의 9%를 지웠습니다. - 속도는 40배까지 차이 납니다.
nlmeans는 테스트 CPU에서 1080p 기준 초당 약 1프레임으로 돌았고, 다른 1080p 클립 121프레임에는 192초가 걸렸습니다.
bm3d에 대한 주의점이 하나 있습니다. FFmpeg 문서에 따르면 group이 기본값인 1보다 크지 않으면 블록 매칭을 하지 않습니다. 테스트한 빌드에서는 이 값을 올리자 필터가 15배 넘게 느려졌는데도 노이즈는 줄지 않아서, 표에는 기본값을 썼습니다. 이 경우 완전한 BM3D가 아니라 변환 영역 필터로 동작합니다.
표에 나온 명령 두 개입니다. 영상에 맞게 고쳐 쓰세요.
ffmpeg -i input.mp4 -vf "nlmeans=s=6" -c:v libx264 -crf 16 -c:a copy denoised.mp4ffmpeg -i input.mp4 -vf "fftdnoiz=sigma=8:prev=1:next=1" -c:v libx264 -crf 16 -c:a copy denoised.mp4낮은 강도에서 시작해 평평한 부분의 노이즈가 거슬리지 않을 때까지 올린 뒤, 얼굴, 천, 나뭇잎을 100% 배율로 확인하세요. 짧고 실용적인 안내는 AI로 영상 노이즈 제거하는 방법을 참고하세요.
압축 손상: 블록, 링잉, 밴딩
대부분의 코덱은 프레임을 블록으로 나눠 변환하고, 남기기 가장 부담스러운 디테일을 반올림해 버립니다. 이 반올림에서 세 가지 손상이 나옵니다.
- 블로킹. 반올림이 거칠면 이웃한 블록의 경계가 맞지 않아 격자가 나타납니다. MPEG-2, MPEG-4 Part 2(DivX·Xvid 시절 파일), Motion JPEG에서는 8×8 사각형으로 보입니다. H.264와 HEVC는 코덱 안에서 블록 경계를 필터링하므로, 손상이 격자보다는 번지고 얼룩진 모습으로 나타나는 경향이 있습니다. 두 종류는 깨진 영상 고치는 방법에서 볼 수 있습니다.
- 링잉과 모스키토 노이즈. 고주파를 반올림하면 날카로운 가장자리와 글자 옆에 물결이 남고, 이것이 프레임마다 기어다닙니다.
- 밴딩. 8비트 파이프라인이나 하늘을 평평하게 뭉갠 코덱 때문에 매끄러운 그라데이션이 너무 적은 단계로 저장되면 눈에 보이는 계단이 됩니다.
디블로킹
나뭇잎 클립을 낮은 비트레이트의 MPEG-2로 인코딩한 뒤, 8픽셀 블록 경계를 가로지르는 밝기 계단이 다른 곳보다 얼마나 큰지 점수를 매겼습니다(1.0이면 격자가 보이지 않음. 깨끗한 클립은 0.99, MPEG-2 파일은 2.08).
| 필터 | 하는 일 | 블록 점수 | PSNR(휘도) |
|---|---|---|---|
| MPEG-2 파일 | 기준 | 2.08 | 27.7 dB |
deblock=filter=strong | 계단처럼 보이는 블록 경계를 매끄럽게 함 | 1.78 | 27.7 dB |
pp7=qp=12 | 위치를 옮겨 가며 DCT 계수에 임계값 적용 | 1.43 | 27.4 dB |
spp=quality=4:qp=12 | 여러 위치에서 다시 압축해 평균 | 1.24 | 27.6 dB |
spp=quality=4:qp=24 | 같은 방식, 더 강하게 | 1.04 | 26.4 dB |
uspp=quality=3:qp=12 | spp와 비슷하지만 위치마다 실제 코덱으로 인코딩 | 1.03 | 27.5 dB |
교훈은 두 가지입니다. 첫째, 디블로킹은 격자를 가릴 뿐 인코더가 버린 것을 되돌리지는 못합니다. 적당한 설정에서는 PSNR이 거의 움직이지 않았고, 가장 강한 spp 설정은 화면을 흐리면서 1.3 dB를 잃었습니다. 둘째, spp, pp7, fspp, uspp에는 양자화 값이 필요합니다. 디코더가 값을 제공하면 스트림에서 읽지만, 테스트에서는 qp를 직접 지정할 때까지 아무것도 바뀌지 않았습니다. 12 근처에서 시작해 블록이 남아 있을 때만 올리세요.
ffmpeg -i old.mpg -vf "spp=quality=4:qp=12" -c:v libx264 -crf 16 -c:a aac deblocked.mp4글자와 가장자리 주변의 링잉에는 spp의 mode=soft도 있습니다. FFmpeg 문서는 디링잉 효과가 더 좋지만 더 흐려질 수 있다고 설명합니다.
밴딩 제거
밴딩에는 샤프닝과 반대 처리가 필요합니다. 계단을 섞은 뒤 다시 생기지 않게 막아야 합니다. 실제 압축 밴딩이 있는 KwaFlux 번들 샘플 클립의 하늘에서, 각 행을 따라 평평한 구간이 얼마나 긴지 처리 전후로 측정했습니다.
- 소스: 평평한 구간은 평균 10.4픽셀이었고, 그중 20%가 24픽셀 이상이라 띠로 보였습니다.
- **
deband:** 평균 2.8픽셀, 그만큼 긴 구간은 0.8%였습니다. - **
gradfun:** 1.3픽셀, 그만큼 긴 구간은 없었습니다. FFmpeg 문서는 압축 과정에서 디더가 사라져 띠가 되살아나기 쉬우므로 재생 전용으로 설계됐다고 설명합니다.

그러니 보관할 파일은 밴딩을 제거한 뒤 10비트로 인코딩하세요. 늘어난 단계가 매끄러워진 그라데이션을 지켜 줍니다. 이유는 8비트 vs 10비트 영상에서 설명합니다.
ffmpeg -i input.mp4 -vf "deband" -c:v libx264 -crf 16 -pix_fmt yuv420p10le -c:a copy debanded.mp4헤일로 없는 샤프닝
샤프닝은 가장자리의 대비를 높입니다. 고전적인 방법인 언샤프 마스크는 화면에서 흐린 사본을 빼 가장자리를 찾고, 그 차이에 양을 곱해 다시 더합니다. 부작용은 오버슈트입니다. 가장자리의 밝은 쪽에는 밝은 선이, 어두운 쪽에는 어두운 선이 생깁니다. 이것이 헤일로입니다.
AMD FidelityFX의 대비 적응형 샤프닝(CAS)은 픽셀마다 양을 조절합니다. 이미 선명한 곳에는 덜, 디테일이 부족한 곳에는 더 겁니다.
레벨 60에서 180으로 넘어가는 부드러운 가장자리를 샤프닝하고 오버슈트를 측정했습니다.
| 필터 | 어두운 헤일로(60 아래로 내려간 레벨) | 밝은 헤일로(180 위로 올라간 레벨) |
|---|---|---|
unsharp, 5×5, 양 1.5 | 4 | 2 |
unsharp, 7×7, 양 2.5 | 20 | 16 |
cas=strength=0.5 | 약 2 | 없음 |
cas=strength=1.0 | 35 | 2 |

FFmpeg 문서는 unsharp 양으로 −1.5~1.5가 적당하다고 하며, 2.5로 돌린 결과가 그 이유를 보여 줍니다. CAS는 적당한 강도에서는 깨끗했지만 최대 강도에서는 넷 중 가장 깊은 어두운 헤일로를 그렸습니다. 적응형이라고 해서 어떤 설정에서든 안전한 것은 아닙니다. 샤프닝을 정직하게 쓰는 습관 두 가지입니다.
- 샤프닝은 스케일링 후에, 사람들이 실제로 볼 크기에서 하고, 그 크기의 100% 배율로 판단하세요.
- 샤프닝이 못 하는 일을 기억하세요. 살아남은 가장자리를 가파르게 할 뿐, 초점이나 모션 블러로 잃은 디테일은 되살리지 못합니다. 그런 경우는 흐릿한 영상 고치는 방법을 참고하세요.
ffmpeg -i input.mp4 -vf "cas=strength=0.4" -c:v libx264 -crf 16 -c:a copy sharpened.mp4색 틀어짐과 색수차
색 틀어짐: 화이트 밸런스
색 틀어짐은 카메라가 빛을 잘못 판단해 모든 색이 같은 방향으로 밀리는 현상입니다. 텅스텐 조명에서는 흰색이 주황빛, 그늘에서는 파란빛이 됩니다. 이를 고치려면 중립색이 다시 중립으로 보일 때까지 빨강, 초록, 파랑 채널을 스케일링합니다. 방법마다 '중립'을 찾는 방식이 다릅니다.
- 그레이 월드는 장면의 평균 반사율이 무채색이라고 가정합니다. 색이 다양한 장면에서는 통하지만 한 색이 지배하는 장면에서는 실패합니다.
- 그레이 엣지는 van de Weijer, Gevers, Gijsenij가 제안한 방법으로, 장면의 평균 *가장자리 차이*가 무채색이라고 가정합니다. 넓은 단색 영역의 영향을 덜 받습니다.
- 알려진 중립 기준은 그레이 카드, 흰 벽, 흰 선체처럼 흰색이나 회색임을 아는 대상을 측정해 그것을 중립으로 만드는 게인을 계산합니다.
바다 위 보트가 나오는 번들 샘플 클립의 한 프레임에 따뜻한 색 틀어짐을 더한 뒤 세 가지 방법으로 보정하고, 원본 프레임과의 평균 색 차이(ΔE, 낮을수록 가까움)를 측정했습니다.
| 방법 | 원본 대비 평균 ΔE | 흰 선체의 빨강 − 파랑 |
|---|---|---|
| 원본 프레임 | 기준 | −6 |
| 따뜻한 색 틀어짐 추가 | 19.9 | 39 |
grayworld | 15.4 | 36 |
greyedge | 8.9 | 9 |
선체 기준 게인(colorchannelmixer) | 5.9 | 0 |

그레이 월드는 교과서대로 실패했습니다. 프레임 대부분이 파란 하늘과 바다라서 하늘을 중립으로 만들고 선체는 주황빛으로 남겼습니다. 그레이 엣지는 상당 부분을 되돌렸고, 선체 기준 게인이 원본에 가장 가까웠습니다. 게인을 계산하려면 중립 영역의 RGB 값을 샘플링한 뒤 초록 값을 빨강과 파랑으로 각각 나눕니다. 선체 값은 156, 144, 117이었으므로 빨강은 144 ÷ 156 = 0.923, 파랑은 144 ÷ 117 = 1.232입니다.
ffmpeg -i input.mp4 -vf "colorchannelmixer=rr=0.923:bb=1.232" -c:v libx264 -crf 16 -c:a copy balanced.mp4중립 기준이 없다면 자동 방식 중에서는 그레이 엣지가 더 안전합니다. FFmpeg 문서가 이 필터들에 권하는 대로 선형광에서 실행하세요.
ffmpeg -i input.mp4 -vf "zscale=transfer=linear,format=gbrpf32le,greyedge=difford=1:minknorm=5:sigma=2,zscale=transfer=bt709,format=yuv420p" -c:v libx264 -crf 16 -c:a copy balanced.mp4색 틀어짐에 밋밋하고 칙칙한 색까지 겹쳤다면 색보정이 더 빠른 해결책인 경우가 많습니다. 그쪽은 AI 색보정에서 다룹니다.
색수차: 채널 다시 맞추기
색수차는 렌즈 문제입니다. 유리가 파장마다 빛을 다르게 굴절시켜 색이 같은 자리에 맺히지 않습니다. 두 가지 유형이 있습니다.
- 배율(횡) 색수차는 색마다 배율이 조금씩 다른 것입니다. 보통 빨강–청록이나 파랑–노랑인 테두리가 중앙에는 없고 화면 가장자리로 갈수록 커집니다. 조리개를 조여도 나아지지 않지만 후처리로는 고칠 수 있습니다. 빨강과 파랑 채널을 스케일링해 초록과 다시 맞추면 됩니다.
- 축상(종) 색수차는 색마다 초점 거리가 다른 것입니다. 주로 조리개를 최대로 열었을 때 화면 어디서든 대비가 강한 가장자리 주변에 보라나 초록 테두리가 생깁니다. 스케일링으로는 고칠 수 없고, 테두리를 마스킹하거나 채도를 낮춰 가릴 수 있을 뿐입니다.
보정을 테스트하려고 체커보드 차트의 빨강 채널을 중앙 기준으로 0.5% 키우고 파랑을 0.5% 줄인 뒤, 가장자리 근처의 빨강–파랑 평균 차이를 측정했습니다.
| 버전 | 왼쪽 가장자리 | 중앙 | 오른쪽 가장자리 |
|---|---|---|---|
| 깨끗한 차트 | 0 | 0 | 0 |
| 배율 색수차 시뮬레이션 | 37.5 | 2.3 | 37.5 |
균일한 채널 이동(rgbashift) | 77.3 | 43.3 | 6.9 |
| 방사형 보정(역스케일링) | 0.5 | 0.5 | 0.5 |

균일한 이동은 흔한 실수입니다. 배율 색수차는 중앙에서 멀어질수록 커지기 때문에, 한쪽은 맞추지만 반대쪽 오차는 두 배가 됩니다. 방사형 보정은 중앙을 기준으로 빨강은 줄이고 파랑은 키웁니다. FFmpeg의 perspective 필터로 하면 서브픽셀 정밀도로 작동합니다. 아래 숫자는 1920 × 1080 프레임과 0.5%에 맞춘 것이니, 내 영상을 측정해 다시 계산하세요(여백은 너비 × (1 − 1/1.005)의 절반과 높이 × (1 − 1/1.005)의 절반입니다).
ffmpeg -i input.mp4 -filter_complex "[0:v]format=gbrp,extractplanes=r+g+b[r][g][b];[r]perspective=x0=4.776:y0=2.687:x1=1915.224:y1=2.687:x2=4.776:y2=1077.313:x3=1915.224:y3=1077.313:interpolation=cubic:sense=destination[r2];[b]perspective=x0=4.776:y0=2.687:x1=1915.224:y1=2.687:x2=4.776:y2=1077.313:x3=1915.224:y3=1077.313:interpolation=cubic:sense=source[b2];[g][b2][r2]mergeplanes=0x001020:gbrp,format=yuv420p" -c:v libx264 -crf 16 -c:a copy fixed.mp4팁: 테스트에서 extractplanes는 입력한 순서와 상관없이 R, G, B 순서로 평면을 돌려줬습니다. 그래서 extractplanes=g+b+r이라고 써도 빨강이 먼저 나옵니다. 출력 이름을 R, G, B 순서로 붙이지 않으면 채널이 뒤바뀝니다. RAW 변환기와 렌즈 프로파일을 지원하는 편집 프로그램은 이 보정을 자동으로 해 주므로, 내 렌즈가 데이터베이스에 있다면 그쪽이 더 쉽습니다.
전체 FFmpeg 체인
블록과 노이즈가 많고 따뜻한 색 틀어짐이 있는 오래된 720p 클립을 1080p로 업스케일링하는 전체 순서를 명령 하나로 묶으면 다음과 같습니다.
ffmpeg -i input.mp4 -vf "bwdif=mode=send_frame:deint=interlaced,spp=quality=4:qp=12,hqdn3d=4:3:6:4.5,colorchannelmixer=rr=0.92:bb=1.23,scale=1920:-2:flags=lanczos,cas=strength=0.4,deband,noise=c0s=4:c0f=t" -c:v libx264 -crf 16 -preset slow -tune grain -pix_fmt yuv420p10le -c:a copy restored.mp4| 필터 | 단계 | 참고 |
|---|---|---|
bwdif=mode=send_frame:deint=interlaced | 디인터레이스 | 인터레이스로 표시된 프레임만 처리. 프로그레시브 소스라면 빼기 |
spp=quality=4:qp=12 | 디블로킹 | 블록이 눈에 보이는 소스에만 |
hqdn3d=4:3:6:4.5 | 노이즈 제거 | 기본값을 적어 둔 것. 노이즈가 심하면 fftdnoiz나 nlmeans로 바꾸기 |
colorchannelmixer=rr=0.92:bb=1.23 | 화이트 밸런스 | 내 중립 영역에서 구한 게인으로 바꾸기 |
scale=1920:-2:flags=lanczos | 스케일링 | 일반 업스케일링. AI 업스케일러라면 이 자리에 들어감 |
cas=strength=0.4 | 샤프닝 | 출력 크기에서 가볍게 |
deband | 밴딩 제거 | 그라데이션의 계단을 섞음 |
noise=c0s=4:c0f=t | 그레인 | 프레임마다 바뀌는 미세한 휘도 그레인 |
-tune grain -pix_fmt yuv420p10le | 인코딩 | 그레인과 그라데이션을 지킴. 10비트 H.264는 재생되는 기기가 적으니 마스터용으로 쓰기 |
테스트 노트북에서 이 체인은 720p 샘플 클립 150프레임을 1080p H.264 High 10으로 처리하는 데 32.8초가 걸렸습니다. 배포용으로는 마스터를 HEVC Main 10이나 그레인을 넣은 8비트 H.264로 인코딩하세요.
AI 모델의 자리와 앞으로의 방향
고전 필터에는 파라미터가 몇 개뿐이고 노이즈가 어떻게 생겼는지에 대한 고정된 생각이 있습니다. 학습형 모델은 그 고정된 생각을 예시에서 배운 것으로 바꿉니다.
- 단일 이미지 모델(DnCNN, FFDNet, 그 뒤를 이은 복원 네트워크)은 깨끗한 이미지와 열화된 이미지의 차이를 학습해 노이즈, 블록, 블러를 한 번에 없앨 수 있습니다.
- 다중 프레임 모델은 정렬한 여러 프레임을 결합하므로, 두 프레임 이상에 나타나는 디테일을 짐작하지 않고 되살립니다. FastDVDnet은 비용이 큰 움직임 보상 단계 없이도 이것이 가능함을 보여 줬습니다. 정렬이 실패하면 꼬리 잔상이 남는데, 이는 시간적 일관성, 깜빡임, 잔상에서 다룹니다.
- 생성형 모델(GAN과 디퓨전)은 입력에 없는 질감을 더합니다. 디테일의 원천이자 위험의 원천입니다. 그 트레이드오프와 2026년의 한 단계 디퓨전 복원 흐름은 AI 복원 영상이 플라스틱처럼 보이는 이유에서 다룹니다.
고전 필터에서 얻은 교훈은 그대로 이어집니다. 키우기 전에 복구하고, 질감을 조금은 남기고, 100% 배율과 재생 상태에서 판단하세요.
KwaFlux는 어떻게 다루나
- 스마트 복구가 여러 단계를 조합합니다. 화질 복구의 스마트 복구는 클립을 분석해 노이즈 제거, 샤프닝, 색과 밝기 보정, 업스케일링, 얼굴과 미세 디테일 복구를 조합하며, 이웃 프레임을 활용합니다.
- 장면 복구는 한 가지 손상을 겨냥합니다. 야경은 저조도 노이즈를, 필름 그레인 제거는 그레인을 다루며, 안개 제거, 비 제거, 애니메, 채색도 있습니다.
- 디인터레이스가 먼저입니다. 화질 복구 작업대는 디인터레이스, 화질 복구, 스마트 보간 순서로 실행하며, 이 글에서 권하는 순서와 같습니다.
- 색 틀어짐은 색보정의 몫입니다. AI 색보정의 스마트 컬러는 "색 틀어짐과 칙칙함을 자동 보정"합니다.
- 다단계 작업은 10비트를 유지합니다. 내보내기가 여러 단계로 실행될 때 단계 사이에서 넘기는 파일은 10비트 H.264이므로, 8비트 반올림이 반복되어 밴딩이 생기지 않습니다.
- 미리 보고 비교합니다. 1·3·5초 미리보기를 렌더링하고, 움직임을 판단하기 전에 원본 프레임레이트를 고르고, 미리보기 후 화질 자동 비교를 켜서 점수를 확인하세요. 배율 색수차는 가져오기 전에 위의 명령이나 편집 프로그램의 렌즈 보정으로 고치세요.
문제 해결
| 문제 | 추정 원인 | 해결 |
|---|---|---|
| 노이즈 제거 후 얼굴이 밀랍 같음 | 강도가 너무 높거나 비국소 필터가 질감을 지움 | 강도를 낮추고, 피부를 100% 배율로 비교하고, 마지막에 미세 그레인 더하기 |
| 샤프닝 후 노이즈가 더 심해 보임 | 노이즈 제거 전에 샤프닝했거나 너무 강함 | 노이즈 제거를 먼저 하고, 샤프닝은 마지막에 가볍게 |
| 가장자리에 흰색이나 검은색 윤곽선 | 샤프닝 양이 너무 많음 | 양을 낮추고 cas를 0.3~0.5로 시도하기 |
| 내보낸 뒤 밴딩이 다시 생김 | 8비트 인코딩이거나 압축 중 디더가 사라짐 | 최종 인코딩 직전에 밴딩을 제거하고 10비트로 인코딩하기 |
| 움직이는 물체 뒤에 꼬리 잔상 | 시간 노이즈 제거가 움직임까지 평균함 | 시간 축 강도를 낮추거나 움직임을 고려하는 필터 쓰기 |
| 디블로킹을 해도 변화 없음 | 스트림에서 양자화 값을 받지 못함 | qp를 직접 지정하고 12 근처에서 시작하기 |
| 자동 화이트 밸런스가 하늘을 회색으로 만듦 | 한 색이 지배하는 장면에 그레이 월드 적용 | 그레이 엣지나 알려진 중립 기준에서 구한 게인 쓰기 |
| 색 테두리가 한쪽만 고쳐짐 | 균일한 채널 이동 | 대신 중앙을 기준으로 빨강과 파랑을 스케일링하기 |
할 수 없는 것
- 크기와 대비가 같은 노이즈와 디테일을 구별하는 노이즈 제거 필터는 없습니다. 무언가는 잃게 되고, 무엇을 잃을지는 직접 고릅니다.
- 디블로킹은 경계를 가릴 뿐, 인코더가 버린 것을 되돌리지는 못합니다.
- 샤프닝은 가장자리 대비를 높일 뿐, 해상도를 더하지는 않습니다.
- 채널 스케일링으로는 축상 색수차나 하이라이트가 날아간 부분 주변의 보라색 테두리를 고칠 수 없습니다.
- 자동 화이트 밸런스는 추정입니다. 중립 기준이 없으면 빛에 대한 짐작일 뿐입니다.
마치며
좋은 복원은 작고 정확한 손질을 차례로 쌓는 일입니다. 손상을 진단하고, 각 필터를 다른 필터의 작업을 되돌리지 않는 자리에서 돌리고, 문제가 보이지 않게 되면 바로 멈추세요. 가능하면 측정하고, 100% 배율과 재생 상태에서 비교하고, 티 하나 없는 프레임을 좇기보다 질감을 조금 남기세요.
KwaFlux는 화질 복구를 사용자 GPU에서 실행합니다. AI 처리는 사용자 GPU에서 실행되며 미디어 파일이 처리를 위해 업로드되지 않습니다. Windows 10(64비트, 버전 1809 이상), Windows 11, Apple Silicon 탑재 macOS 12 이상에서 실행됩니다. 미리보기에는 계정이 필요 없습니다. 어떤 클립이든 1·3·5초 미리보기를 렌더링할 수 있습니다. 내보내기, 변환, 파일 복구, 링크에서 파일 다운로드에만 로그인과 유료 플랜이 필요합니다.
내 실제 영상으로 효과를 확인하세요
KwaFlux를 받고 결제 전에 내 영상으로 효과를 무료 미리보기하세요. 계정이 필요 없고, 내 GPU에서 처리하며 미디어는 업로드하지 않습니다. 영상 미리보기는 1, 3 또는 5초, 흔들림 보정 미리보기는 5, 15 또는 30초 중에서 고를 수 있습니다.
자주 묻는 질문
노이즈 제거는 샤프닝 전에 해야 하나요, 후에 해야 하나요?
전에 하세요. 샤프닝은 노이즈를 포함해 가장자리 크기의 모든 것의 대비를 높이므로, 뒤에 돌리는 노이즈 제거 필터가 지워야 할 것이 늘어납니다. 테스트에서도 노이즈 제거를 먼저 했을 때 평평한 부분에 남은 노이즈가 적었고(12.2 대 14.5), 깨끗한 클립 대비 점수도 높았습니다.
디테일을 많이 남기는 영상 노이즈 제거 필터는 뭔가요?
모든 경우에 맞는 필터 하나는 없고, 영상과 노이즈에 따라 다릅니다. 테스트에서는 이웃 프레임을 쓰는 주파수 영역 필터가 잎 질감의 98%를 지키면서 두 번째로 높은 점수를 받았습니다. AI로 영상 노이즈 제거하는 방법에서처럼 100% 배율로 잘라 비교하세요.
샤프닝으로 흐릿한 영상을 고칠 수 있나요?
일부만 가능합니다. 샤프닝은 아직 남아 있는 가장자리를 가파르게 하므로 약간 부드러운 영상은 더 또렷해 보이지만, 초점이나 모션 블러로 잃은 디테일은 되살리지 못하고, 무리하면 헤일로가 생깁니다. 실제 블러는 흐릿한 영상 고치는 방법을 참고하세요.
내보낸 뒤 밴딩이 왜 다시 생기나요?
8비트 인코딩이 매끄러워진 그라데이션을 다시 반올림하고, 압축 과정에서 계단을 가려 주던 미세한 디더가 사라지기 쉽기 때문입니다. 최종 인코딩 직전에 밴딩을 제거하고, 배포 조건이 허락하면 10비트로 인코딩하고, 평평한 부분에 질감이 조금 남도록 그레인을 살짝 더하세요.
자동 화이트 밸런스는 믿을 만한가요?
경우에 따라 다릅니다. 자동 방식은 가정을 바탕으로 빛을 추정합니다. 그레이 월드는 장면의 평균이 회색이라고 보기 때문에 한 색이 지배하면 실패하고, 그레이 엣지는 더 잘 버팁니다. 흰색이나 회색임을 아는 대상에서 측정한 게인이 더 믿을 만한 해결책입니다.
색수차는 후보정으로 없앨 수 있나요?
일부는 가능합니다. 테두리가 화면 가장자리로 갈수록 커지는 배율 색수차는 중앙을 기준으로 빨강과 파랑 채널을 스케일링해 보정할 수 있습니다. 화면 어디서든 밝은 가장자리 주변에 보라나 초록 테두리가 생기는 축상 색수차는 마스킹하거나 채도를 낮춰 가릴 수밖에 없습니다.
참고 자료
- Buades, Coll, and Morel, "Non-Local Means Denoising," Image Processing On Line, 2011 (averaging similar pixels, which need not be close) (2026-10-22 확인)
- Lebrun, "An Analysis and Implementation of the BM3D Image Denoising Method," Image Processing On Line, 2012 (grouping similar 2D patches into 3D groups) (2026-10-22 확인)
- Zhang et al., "Beyond a Gaussian Denoiser: Residual Learning of Deep CNN for Image Denoising" (DnCNN, residual learning) (2026-10-22 확인)
- Zhang, Zuo, and Zhang, "FFDNet: Toward a Fast and Flexible Solution for CNN-Based Image Denoising" (noise-level map input) (2026-10-22 확인)
- Tassano, Delon, and Veit, "FastDVDnet: Towards Real-Time Deep Video Denoising Without Flow Estimation" (multi-frame denoising without motion compensation) (2026-10-22 확인)
- AMD GPUOpen, "AMD FidelityFX Contrast Adaptive Sharpening (CAS)" (per-pixel sharpening amount) (2026-10-22 확인)
- van de Weijer, Gevers, and Gijsenij, "Edge-Based Color Constancy," IEEE Transactions on Image Processing, 2007, author's copy (gray-world and gray-edge assumptions) (2026-10-22 확인)
- Wikipedia, "Chromatic aberration" (axial and transverse types; transverse corrected by radial scaling, axial hard to remedy in post) (2026-10-22 확인)
- FFmpeg Filters Documentation (`hqdn3d`, `atadenoise`, `nlmeans`, `bm3d`, `fftdnoiz`, `deblock`, `spp`, `uspp`, `deband`, `gradfun`, `unsharp`, `cas`, `grayworld`, `greyedge`, `perspective`, `extractplanes`, `bwdif`) (2026-10-22 확인)
- x264 source, x264.c help text (`--tune grain` settings) (2026-10-22 확인)

