In-loop Filtering in HEVC / VVC
Image Filtering
- 영상/동영상 처리에서의 가장 기본적인 function
- 목적
- 잘 알려진 필터
- Gaussian filter
- Bilateral filter
- Non-local means filter
- Guided filter
영상 압축에서의 필터링
디비오 압축에서 필터링을 사용하는 이유
- 양자화 과정 중 손실이 발생하여 degradation이 발생하게 되는데 필터링을 거쳐 다시 좋게 만들기 위해 사용한다
degradation
- 원본 영상의 품질이나 정보가 손상되거나 저하되는 현상을 의미
artifact의 종류
- Blocking artifact
- Ringing artifact
- Blurring artifact
- Color bias artifact
- Temporal inconsistency artifact
비디오 압축 artifacts
Blocking artifact
- 블록과 블록 사이에 명확한 경계가 생기는 현상으로, 이로 인해 전체 영상이 블록 형태로 나뉘어 보이는 문제가 발생한다
- 블록 마다 다른 처리를 하기 때문에 발생한다
Ringing artifact
- transform 과정에서 발생한다
- 신호나 이미지를 처리하는 필터의 특성 때문에 발생하는데, 특히 고주파 성분을 강조하는 필터를 사용하면 더욱 명확하게 나타난다
- 또한 sharp transition이 있는 영상의 경계에서 ripple이 있는 필터 때문에 발생한다
비디오 코덱에서의 In-loop Filter
in-loop filter 라고 부르는 이유
- 비디오 코덱 과정 중 loop 구조가 존재한다
- 앞서 압축했던 영상을 reference 삼아서 prediction을 수행하기 위함이다
- loop 구조안에 필터가 있어 in-loop filter라고 부른다

필터의 종류
- Post-processing filter
- 영상이나 신호 처리 과정의 마지막 단계에서 적용되는 필터를 말한다
- In-loop filter
- 나중에 reference로 사용할 프레임을 필터링한다
- motion estimation/compensation 같은 prediction accuracy 도 동시에 향상시킬 수 있다
Deblocking Filter(DF)
- In-loop filter에서 두 번째에 위치하는 필터이다
- blocking artifact를 최소화하기 위해서 만들어 졌다
- 블록간에 smooth transition을 목표를 만들어 졌다
- 각 블록의 경계에서 블록 내부의 픽셀 값과 인접 블록의 픽셀 값을 비교하고, 이들이 일정 차이 이상일 경우 이를 조정하여 경계를 부드럽게 만든다
- bS(boundary strength)를 잘 찾아서 이를 바탕으로 최적의 필터 파라미터를 찾는 것이 중요하다
Boundary decision / filter length decision
- 블록간의 경계가 CU/TU 인지 아니면 PU 인지에 따라 알고리즘이 적용되어 있다
CU/TU Boundary
- Filter length for P/Q blocks : Sp/Sq = { 7/7, 7/5, 5/7, 5/5, 7/3, 3/7, 5/3, 3/5, 3/3, 1/1 }
- 각 요소들은 P/Q 블록의 사이즈와 각각의 경계와 얼마나 떨어져 있는지에 따라서 정해진다
PU Boundary
- Filter length for P/Q blocks : Sp/Sq = { 3/3, 2/2, 1/1 }
- 각 요소들은 각각의 경계와 얼마나 떨어져 있는지에 따라서 정해진다
bS(boundary strength)
- bS는 블록 간 경계의 강도를 나타내며, 경계가 얼마나 뚜렷한지를 측정하는 지표이다
- bS 값에 따라 Deblocking Filter의 동작이 결정되는데, bS 값이 높을수록 해당 경계는 더 많은 필터링을 받게 된다
- 즉, 블록 간 경계가 더 뚜렷할수록 (bS 값이 높을수록) 그 경계는 더 강하게 필터링되어 블록화 현상이 줄어들게 된다
- bS는 보통 블록 간의 픽셀 값 차이를 계산하여 결정되며, 이는 압축 알고리즘에 따라 다르게 설정될 수 있다
- bS의 값은 2, 1, 0 으로 3 가지의 값만 가진다
- bS가 0이 되면 필터링을 취하지 않는다
bS = 2 의 조건
- P나 Q 둘 중 하나라도 Intra면 bS는 2가 된다
- P나 Q 둘 중 하나라도 CIIP 모드를 가지고 있으면 bS는 2가 된다 (VVC)
bs = 1 의 조건
- P나 Q 둘 중 하나라도 non-zero coeffs을 가지면 bS는 1이 된다
- non-zero coeffs을 가진다의 뜻 : P 혹은 Q가 prediction을 마치고 나서 residual이 들어갔다는 뜻이다
- residual이 들어간다는 것 자체가 prediction이 완벽하지 않아 추가적인 정보가 사용됐다는 말이다
- | MVp - MVq >= 1/2 |
- P와 Q의 MV가 많이 크면 클수록 다른 곳에서 예측되었기에 다르다고 판단하는 것이다
- P와 Q가 서로 다른 pred_mode를 가진다면 bS는 1이 된다 (VVC)
- P와 Q가 IBC를 사용한다면 bS는 1이 된다 (VVC)
bS가= 0 의 조건
- bS = 2 의 조건과 bS = 1 의 조건 모두 만족하지 않았을 때 bS는 0이 된다
β, tc
- 필터링을 할지 말지, 필터링을 강하게 적용할지 약하게 적용할지를 정한는 파라미터이다
- β(beta)
- 블록 경계의 강도를 조절한다
- β 값이 크면 필터링 강도가 더욱 강해져 블록 경계가 더욱 흐려지고, β 값이 작으면 필터링 강도가 약해져 블록 경계가 더욱 뚜렷해진다
- 이 매개변수는 블록 경계의 픽셀 값과 인접한 픽셀 값의 차이를 비교하여 결정되며, 이 차이가 β 값보다 크면 해당 경계는 필터링되지 않는다
- tc (threshold for clipping)
- 매개변수는 필터링된 픽셀 값의 최대 변화량을 제한한다
- 즉, 필터링에 의한 픽셀 값의 변화가 tc 값을 초과하지 않도록 한다
- 는 필터링에 의한 과도한 변화를 방지하여 영상의 자연스러움을 유지하는 데 도움이 된다
- tc 값은 영상의 품질에 따라 다르게 설정될 수 있으며, 일반적으로 높은 품질의 영상에서는 낮은 tc 값을, 낮은 품질의 영상에서는 높은 tc 값을 사용한다
- β, tc는 Q, P에 대한 함수이다
- Q, P가 커지면 β, tc도 커진다
- VVC에서는 qpOffset이 있는데 값 0, 1, 2, 3으로 QPavg를 조절한다
Deblocking Filter Operation
- 만약 Sp 혹은 Sq 둘 중 하나라도 3보다 크다면 long-tap deblocking filter를 적용한다
- Sp, Sq 둘 다 3이라면 short-tap strong filter를 적용한다
- 그 외 나머지 경우에는 -tap weak filter를 적용한다
Short-tap filtering on/off
- Short-tap filtering on/off 조건
- bS > 0
- dp0 + dq0 + dp3 + dq3 < β
- dp0 = | p2_0 - 2p1_0 + p0_0|, dq0 = | q2_0 - 2q1_0 + q0_0|, dp3 = | p2_3 - 2p1_3 + p0_3|, dq3 = | q2_3 - 2q1_3 + q0_3|
Short-tap filtering strong/weak
- 조건 β, tc
- 2d_i < ( β >> 2 )
- | p3_i - p0_i | + | q3_i - q0_i | < ( β >> 3 )
- | p0_i - q0_i | < (( 5*tc + 1 ) >> 1 )
- for i = 0 AND 3
- d_i = | p2_i - 2p1_i + p0_i | + | q2_i - 2q1_i + q0_i |
- 위의 조건을 만족하면 strong filter를 적용한다
Long-tap filtering
- VVC에서 적용된 기술
- 더 많은 픽셀을 고려하여 블록 경계의 부드러움을 향상시키는 방법이다
- Long-tap filtering을 사용하면 필터링을 위한 계산 복잡성이 증가할 수도 있다
Sample Adaptive Offset(SAO)
- ringing artifact를 줄이기 위해 고안되었다
- 원본 영상과 reconstructed pixel 간의 오차를 최소화하도록 offset을 찾는 것이다
- K 개의 그룹으로 나누고 각각의 그룹마다 K 개의 Offset을 사이드 정보로 전송한다
- 어떻게 그룹으로 나눈지가 중요하다
- Error(pixel)을 기준으로 2 가지가 있다
Edge Offset(EO)
- 픽셀의 Edge 타입을 결정해서 이를 바탕으로 분류
- 4 가지의 방향이 있다
- 0° : Horiaontal(EO class = 0)
- 90° : Vertical(EO class = 1)
- 135° : 135° diagnal(EO class = 2)
- 45° : 45° diagnal(EO class = 3)
- 각각의 Edge 모양에 따라 5가지의 Category를 갖는다


- 4 가지의 Category에 속하지 않는다면 0이 된다
- 4 가지의 Category에 대해 optimal offset을 찾는다
- 즉, 4 가지로 분류하고 각각의 Original과 Reconstructed pixel의 차이를 찾는 것이다
- Cateogory 0은 찾지 않는다
- 총 4 개의 Offset이 나온다
- 4 개의 Offset이 한 클래스마다 나온다
- 최종적으로 2 Bit로 어느 방향(class)이 가장 좋은지 전송하고 Offset 정보도 전송한다
Band Offset(BO)
- 현재 픽셀 값을 밴드화 시켜서 이를 바탕으로 분류
- 현재 픽셀의 Value(현재 픽셀이 어느 Band에 속해있는지)를 가지고 분류한다
Band
- 현재 픽셀의 밝기값(intensity)이 어디에 속해있는가
- 전체 intensity 값이 0 ~ 255 라면 이것을 32 개의 Band로 나눈다
- 현재 픽셀이 어느 Band에 속하는지 mapping할 수 있다
- 각 Band 별로 최적의 Offset을 찾을 수 있게 된다
- Offset 전부를 보내기는 어려우므로 4개의 연속된 Band를 묶어서 어느 그룹이 에러를 최소화 시켰는지를 찾아 그 Offset을 전송한다
- 전송 시 first band position을 보내고 4 개의 Offset과 Offset의 부호를 보내게 된다
- Original과 reconstructed 된 값 사이에 차이(에러)가 발생하게 되는데 그 에러가 '각 band 별로 일정할 것이다'라고 가정하고 Offset을 모아서 전송하면 괜찮지 않을까 해서 만들어진 기술이다
- Merge mode
- 주변의 SAO의 offset의 값을 그대로 사용하여 offset, sign, first band position 등을 보낼 필요 없이 1 Bit의 flag만 보내도 된다
Adaptive Loop Filter(ALF)
- VVC에서 새롭게 채택된 기술
- 주변 픽셀의 정보를 가지고 현재 픽셀을 복원하는 기술
- 다이아모드 모양의 filter를 가지고 있다
- luma는 7 X 7, chorma는 5 X 5 모양을 가지고 있다
- 중심값을 기준으로 Point-symmetry 구조를 가지고 있다
- 제한사항
- integer coefficient를 사용한다
- 전체 coefficient의 합이 1로 맞춰져 있다
- 기본적으로 linear filtering을 진행하는데 Non-linear filtering도 지원한다
- Non-linear filtering는 clipping 함수로 구현되어 있다
Luma sub-block level filter adaptation
- 영상의 밝기 채널인 루마(Luma)에 대해 서브블록 단위로 필터링을 적응적으로 조정한다
- 한 블록을 4 X 4 단위로 sub-block으로 나눈 후 각각 다른 coefficient의 값을 가지는 ALF을 적용시켜 성능을 올리는 기술이다
- 방향성과 얼마나 해당 픽셀이 변화가 심한지(2D Laplacian activity)를 기준으로 25가지로 분류한다
- 압축된 비디오 데이터를 디코딩한 후에 적용되어 재구성 오차를 줄이는 데 도움이 된다
- 영상의 특성에 따라 동적으로 조정되며, 따라서 다양한 유형의 영상에 대해 효과적으로 작동할 수 있다
- 재구성 오차를 줄이고, 따라서 비디오의 전반적인 품질을 향상시키는 데 도움이 된다
- 원본 영상 그 자체에 ALF 필터를 적용하는 것이 아닌 원본 영상이 어떠한 특징을 가질 때 90° 회전을 시킨다든지 Verticla flip을 한다든지 등의 방법으로 최대한 블록 내에 있는 content의 특징을 한 가지로 유지시켜 ALF를 적용시키는 기술
- 원본 영상에 변화를 주는 것이 아닌 coefficient의 방향을 바꿔서 적용한다
Coding tree block(CTB) level filter adaptation
- 영상을 코딩하는 단위인 CTB에 대해 필터링을 적응적으로 조정gksek
- 실제 ALF는 sub-block 단위가 아닌 luma block 단위로도 변경이 된다
- 한 CTB에서 25 개의 luma filter coefficient를 사용한다
- 항상 25 가지의 filter set을 만들 수 없기에 16 가지는 정해진 training set으로 filter set을 만들어 놓고 나머지 중 일부는 앞서 사용했던 filter set을 사용하고 필요하면 현재 영상의 statistics에 맞게 새로운 filter set을 만들어 사용한다
- 찾은 filter coefficient는 Adaptation parameter set(APS)을 통해 전송한다
- chroma는 8개의 filter coefficient를 사용한다
Cross-Component Adaptive Loop Filter(CC-ALF)

- Luma 채널의 정보를 이용하여 Chroma 채널을 필터링하는 방법
- Cb, Cr을 ALF Chroma로 한 번 추출하고 거기에 CC-ALF로 luma에서 Cb와 Cr을 추출한 값을 더하여 최종적으로 Cb와 Cr을 구한다
- luma와 chroma의 position의 miss matching을 보정하기 위해서 3X4 다이아몬드의 모양을 가지며 8 tap filter이다
- ΔR_i를 찾기 위해서 모든 coefficient의 합은 0으로 설정되어 있다
- 그러므로, APS에서는 오직 7개의 coefficient 값만이 코딩된다
- coefficient 값은 2의 n승으로 제한되어 있다
- { 0, 1, 2, 4, 8, 16, 32, 64 }
Luma Mapping with Chroma Scailing(LMCS)
- 필터링보다는 매핑에 가까운 기술
- VVC에서 새롭게 채택된 기술
- LM 기술과 CS 기술로 나뉘어 있다
- LM : Luma mapping
- CS(Chroma Scaling) : Luma에 의존적인 Chroma scaling
Luma mapping(LM)
- data range를 전부 사용하여 coding efficiency를 최대한 높이는 기술
- 균일하지 않은 Luma 신호를 재분배(Reallocation)해서 Luma code value를 넓게 사용하여 높은 압축 효율을 달성

- InputPIvot에서 MappedPivot 간의 Mapping function을 찾는 것이다
- 10-bit의 원본 신호를 총 16 단계로 나눈다
- 64 codeword가 할당된다 (2^10 / 16)
- OrgCW (Original CodeWord) = 64
- InputPivot[i] = i * OrgCW
- 0, 64, 128, ... 의 값을 가지게 된다
- binCW[i] = MappedPivot[i+1] - MappedPivot[i]
- MappedPivot의 차이 값을 전송하게 된다
- 그 bin에서 몇 개의 Mapped luma code가 들어있는지를 나타내는 변수

- Forward mapping function 값을 알면 Backward mapping function 값도 알 수 있다 (선형이기 때문)
Processing domain in LM
- Mapping 과정에서 한 가지 고려되어야 할 점이 있는데, 그것은 Processing 할 때 어떤 함수는 Mapped domain에서 진행해야 할지 아니면 Original domain에서 진행해야 할지를 결정해 주어야 한다
-Mapped domain
- 아래 이미지에서 푸른 박스는 Mapped domain에서 진행된다
- Original domain
- 아래 이미지에서 색이 없는 박스는 Original domain에서 진행된다

Luma-dependent chroma residue scaling(CS)
- Luma와 Chroma 사이의 mismatch를 없애기 위해 수행한다
- Chroma residue value를 Scaling을 통해서 보상한다
- 아래 식을 통해 scaling factor를 구한다

- Forward scaling factor는 나눠서 구하고, Inverse scaling factor는 곱해서 구한다

출처 및 참조
- MPEG뉴미디어포럼/한국방송∙미디어공학회 2023 Summer School
- 오병태, 한국항공대학교