HM 인코더 코드 읽기(27) - 샘플 자동 적응 보상 SAO (一)SAO 소개 및 입구 함수
의 원리
소개하다.
인코딩 과정에서 변환량화를 사용했기 때문에 고주파 교류 계수가 제대로 나오지 않기 때문에 디코딩을 한 후에 이미지의 가장자리에 파문 현상이 발생하는데 이런 것을 진령효과라고 부른다.샘플 자체 적응 보상은 픽셀역에서 착안하여 벨 효과를 낮추는 것이다. 재구성 곡선(픽셀 값을 구분하여 분류하면 얻을 수 있다)에 나타난 파봉 픽셀에 마이너스 값을 추가하고 파곡에 값을 추가하여 보상한다.
SAO는 CTU를 기본 단위로 적합한 분류기를 선택하여 충격의 픽셀을 분류한 후, 서로 다른 픽셀에 대해 서로 다른 보상치를 사용한다.SAO는 경계보상(EO)과 경계보상(BO) 두 가지 보상 방식을 포함하고 파라미터 융합 기술도 도입했다.
경계 보상 EO
이것은 현재 픽셀 값과 인접한 픽셀 값의 크기를 비교하여 현재 픽셀을 분류한 다음에 같은 픽셀에 같은 값을 보상한다.경계 보상에는 가로 방향(EO 0), 세로 방향(EO 1), 135도 방향(EO 2), 45도(EO 3) 등 네 가지 모드가 있습니다.임의의 모드에서픽셀을 아래의 5가지 유형으로 분류할 수 있다. (1)파곡-종류1(2)파곡-종류2(3)상파곡-종류2(4)파곡-종류3(5)상파봉-종류3(6)파곡-종류4(7)기타--종류0
종류 1, 2, 3, 4는 모두 보상해야 하며, 종류 0은 보상하지 않으며, 같은 종류의 픽셀은 같은 보상치를 사용해야 한다
테이프 보상 BO
그것은 픽셀 강도 값에 따라 분류되며, 픽셀 범위를 32개의 테이프로 나눈다.그리고 각 테이프는 삐걱거리는 픽셀의 특징에 따라 보상을 하고 테이프가 같은 보상치를 사용하는 것에 동의한다.일반적인 상황에서
일정한 이미지 영역에서 픽셀 값의 파동 범위는 매우 작다. HEVC는 한 CTU가 4개의 연속적인 테이프만 선택할 수 있도록 규정하고 이 4개의 테이프에 속하는 픽셀만 보상한다. 어느 4개의 테이프를 선택하면 확률 오류 최적화 방법을 통해 확정할 수 있다.
SAO 매개 변수 융합 -merge
매개변수 융합은 인접 블록의 SAO 매개변수를 직접 사용하는 CTU를 의미하며, 이 경우 인접 블록의 SAO 매개변수를 사용하는 방법을 식별하기만 하면 됩니다.현재 블록의 SAO 매개 변수는 다음과 같은 세 가지 선택이 있다. (1) 왼쪽 블록을 직접 사용한다. (2) 위의 블록을 직접 사용한다. (3) 자신의 픽셀 블록의 특징을 분석함으로써자신의 매개 변수를 선택하십시오 (즉 EO 또는 BO 사용) 주의: 한 CTU의 밝기 블록과 색도 블록의 분량은 왼쪽이나 위의 인접 블록의 보상 매개 변수를 동시에 사용해야 합니다. 그렇지 않으면 EO 또는 BO를 사용해야 합니다.
더 많은 정보는 HEVC/H.265 이론 지식(7) - 순환 여파
SAO의 데이터 구조 및 열거
// SAO
typedef enum
{
SAO_MODE_OFF = 0,
SAO_MODE_NEW,
SAO_MODE_MERGE,
NUM_SAO_MODES
}SAOMode;
// SAO merge
typedef enum
{
SAO_MERGE_LEFT =0,
SAO_MERGE_ABOVE,
NUM_SAO_MERGE_TYPES
}SAOModeMergeTypes;
// EO、BO
typedef enum
{
SAO_TYPE_START_EO =0,
SAO_TYPE_EO_0 = SAO_TYPE_START_EO,
SAO_TYPE_EO_90,
SAO_TYPE_EO_135,
SAO_TYPE_EO_45,
SAO_TYPE_START_BO,
SAO_TYPE_BO = SAO_TYPE_START_BO,
NUM_SAO_NEW_TYPES
}SAOModeNewTypes;
// EO ,
typedef enum
{
SAO_CLASS_EO_FULL_VALLEY = 0,
SAO_CLASS_EO_HALF_VALLEY = 1,
SAO_CLASS_EO_PLAIN = 2,
SAO_CLASS_EO_HALF_PEAK = 3,
SAO_CLASS_EO_FULL_PEAK = 4,
NUM_SAO_EO_CLASSES,
}SAOEOClasses;
/*
** sao
** CTU( )
*/
struct SAOStatData //data structure for SAO statistics
{
Int64 diff[MAX_NUM_SAO_CLASSES];
Int64 count[MAX_NUM_SAO_CLASSES];
SAOStatData(){}
~SAOStatData(){}
Void reset()
{
::memset(diff, 0, sizeof(Int64)*MAX_NUM_SAO_CLASSES);
::memset(count, 0, sizeof(Int64)*MAX_NUM_SAO_CLASSES);
}
const SAOStatData& operator=(const SAOStatData& src)
{
::memcpy(diff, src.diff, sizeof(Int64)*MAX_NUM_SAO_CLASSES);
::memcpy(count, src.count, sizeof(Int64)*MAX_NUM_SAO_CLASSES);
return *this;
}
#if SAO_ENCODE_ALLOW_USE_PREDEBLOCK
const SAOStatData& operator+= (const SAOStatData& src)
{
for(Int i=0; i< MAX_NUM_SAO_CLASSES; i++)
{
diff[i] += src.diff[i];
count[i] += src.count[i];
}
return *this;
}
#endif
};
/*
** CTU SAO
*/
struct SAOOffset
{
// SAO : ,new( EO BO),merge
Int modeIdc; //NEW, MERGE, OFF
// :EO_0, EO_90, EO_135, EO_45, BO. MERGE: left, above
Int typeIdc; //NEW: EO_0, EO_90, EO_135, EO_45, BO. MERGE: left, above
// BO
Int typeAuxInfo; //BO: starting band index
Int offset[MAX_NUM_SAO_CLASSES];
SAOOffset();
~SAOOffset();
Void reset();
const SAOOffset& operator= (const SAOOffset& src);
};
/*
** CTU SAO
*/
struct SAOBlkParam
{
SAOBlkParam();
~SAOBlkParam();
Void reset();
const SAOBlkParam& operator= (const SAOBlkParam& src);
SAOOffset& operator[](Int compIdx){ return offsetParam[compIdx];}
private:
// SAO
SAOOffset offsetParam[NUM_SAO_COMPONENTS];
};
SAO의 주 함수
HEVC에서 SAO의 주 함수는 TEnc Sample Adaptive Offset::SAOprocess입니다. 그의 작업 절차는 다음과 같습니다. 1. get Statistics를 호출하여 이미지의 픽셀에 대한 통계 정보를 수집합니다. 픽셀이 EO의 어떤 종류에 속하는지 판단하는 데 사용됩니다./BO의 어느 테이프가 이미지의 모든 CTU에 있는지 판단하는 데 사용됩니다. (1)deriveLoop Filter Boundary Availibility를 호출합니다.루프 필터가 슬라이스나tile의 경계를 뛰어넘을 수 있는지 판단하고 현재 CTU의 이웃이 사용할 수 있는지 판단한다(2) 세 가지 색 분량에 대해 각각 getBlkStats를 호출한다. 이 함수는 픽셀 블록의 픽셀 특성을 통계한 다음에 픽셀이 EO의 어떤 종류에 속하는지 판단한다. 2. 미리 네모난 블록 필터의 표지가 진짜라면그러면 addPreDBFstatistics를 호출한다. 이 함수의 목적은 이전 단계의 통계 정보를 토대로 블록 필터를 제거한 통계 정보를 추가하는 것이다. 3. decidePicParams를 호출하여 픽셀 블록의 세 가지 색 분량(Y, U, V)을SAO 조작해야 하는지 판단하는 것이다. 4. decideBlkParams를 호출하여SAO 처리를 한다.그림의 모든 CTU에 대해 다음과 같은 처리를 한다. (1) getMergeList를 호출하여SAO의merge 목록을 얻는다. (이 단계는 SAO의merge 모드이다) (2) 다음 절차에 따라 각각 EO, BO, Merge 세 가지 유형을 처리한 다음에 가장 좋은 것을 선택한다. ① EO 또는 BO라면,그러면deriveModeNewRDO를 호출하여 EO와 BO의 모든 모델을 처리하고 가장 좋은 모델을 선택한다. ②merge라면deriveModeMergeRDO를 호출하여merge의 모든 방식을 처리한다.가장 좋은 방식 ③ 마지막으로 모든 모델 중 가장 좋은 것을 선택(3) 가장 좋은 모델(EO, BO, Merge 세 가지 중 하나)을 이용하여 Reconstruct Blk SAOparam과offset CTU를 호출하여 재건된 CTU를 보상한다.
/*
** SAO
*/
Void TEncSampleAdaptiveOffset::SAOProcess(TComPic* pPic, Bool* sliceEnabled, const Double *lambdas
#if SAO_ENCODE_ALLOW_USE_PREDEBLOCK
, Bool isPreDBFSamplesUsed
#endif
)
{
TComPicYuv* orgYuv= pPic->getPicYuvOrg();
TComPicYuv* resYuv= pPic->getPicYuvRec();
m_lambda[SAO_Y]= lambdas[0]; m_lambda[SAO_Cb]= lambdas[1]; m_lambda[SAO_Cr]= lambdas[2];
TComPicYuv* srcYuv = m_tempPicYuv;
resYuv->copyToPic(srcYuv);
srcYuv->setBorderExtension(false);
srcYuv->extendPicBorder();
//collect statistics
// , EO /BO
getStatistics(m_statData, orgYuv, srcYuv, pPic);
#if SAO_ENCODE_ALLOW_USE_PREDEBLOCK
if(isPreDBFSamplesUsed)
{
addPreDBFStatistics(m_statData); //
}
#endif
//slice on/off
// SAO
decidePicParams(sliceEnabled, pPic->getSlice(0)->getDepth());
//block on/off
SAOBlkParam* reconParams = new SAOBlkParam[m_numCTUsPic]; //temporary parameter buffer for storing reconstructed SAO parameters
// SAO
decideBlkParams(pPic, sliceEnabled, m_statData, srcYuv, resYuv, reconParams, pPic->getPicSym()->getSAOBlkParam());
delete[] reconParams;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【VSCode 플러그인】 코딩 초보자야말로 Prettier를 우선 인스톨하자(동영상 해설 첨부)이 기사는 「HTML&CSS속습 교실」의 학습 페이지의 하나 「 발췌한 것입니다. Prettier가 어떤 것인지 알 수 있습니다 VSCode 플러그인 설치 방법을 알 수 있습니다 Prettier 플러그인을 활성화하기...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.