最近实验室要跟进AVS会议了,我先看了一下和VVC中相同的技术,帧内预测中的CCLM,在AVS中名字换成了TSCPM,也叫两步色度预测模式,可能是因为专利的冲突,因此才换名字的。实则换汤不换药~

AVS是国内的数字音视频编解码技术标准工作组
参照国际视频标准会议H.266/VVC
目前AVS的参考软件是HPM3.2版本,TSCPM是其中帧内色度预测模式的一种,和VVC的最新参考软件版本VTM5.0中的CCLM一模一样,区别就在于选点的方式不同,而且没有MDLM技术。

下面我来讲一下HPM3.2中的TSCPM技术的细节和具体的代码实现

一、HPM3.2中首先选取固定位置的四个点,然后分了以下三种情况:

①如果左一列和上一行同时存在,则左和上分别取首尾两点如上图所示的01点和23点;
②如果上边存在,但是左边不存在,则对上边等间隔取四个点,间隔为宽度的1/4
③如果左边存在,但是上边不存在,则对左边等间隔取四个点,间隔为高度的1/4

if (bAboveAvaillable){pCur = pCurAbove;//要获取重建的亮度需要去从xGetSrcPixel()函数中获取,即VTM中的pSrcint idx = ((numSteps - 1) * uiCWidth) / minDim;iRefPointLuma[0] = xGetSrcPixel(0, 1); // 上一行的第一个参考点的重建亮度;iRefPointChroma[0] = pCur[0];//对应的重建色度iRefPointLuma[1] = xGetSrcPixel(idx, 1); // 上一行的最后一个参考点的重建亮度;iRefPointChroma[1] = pCur[idx];// 如果左一列不存在,即仅有一条边,则一条边使用四个点if (!bLeftAvaillable && uiCWidth >= 4){int uiStep = uiCWidth >> 2;//跳点间隔是宽度的1/4for (int i = 0; i < 4; i++){iRefPointLuma[i] = xGetSrcPixel(i * uiStep, 1); // pSrc[i * uiStep];iRefPointChroma[i] = pCur[i * uiStep];}}}//如果左有效,和上面是操作相同if (bLeftAvaillable){pCur = pCurLeft;int idx = ((numSteps - 1) * uiCHeight) / minDim;iRefPointLuma[2] = xGetSrcPixel(0, 0); // pSrc[0];iRefPointChroma[2] = pCur[0];iRefPointLuma[3] = xGetSrcPixel(idx, 0); // pSrc[idx * iSrcStride];iRefPointChroma[3] = pCur[idx];// using 4 points when only one borderif (!bAboveAvaillable && uiCHeight >= 4){int uiStep = uiCHeight >> 2;for (int i = 0; i < 4; i++){iRefPointLuma[i] = xGetSrcPixel(i * uiStep, 0); // pSrc[i * uiStep * iSrcStride];iRefPointChroma[i] = pCur[i * uiStep];}}}

二、然后对四个点进行排序得到最大点和最小点,也分了三种情况:

①如果左一列和上一行同时存在,则对左和上分别取到的首尾两点进行四次比较,得到两个较小的点,然后求平均得到最小点。得到两个较大点,求平均得到最大点;

if ((bAboveAvaillable &&  bLeftAvaillable)|| (bAboveAvaillable && !bLeftAvaillable  && uiCWidth >= 4)|| (bLeftAvaillable && !bAboveAvaillable && uiCHeight >= 4)){
#if SIMP_TSCPM//如果上和左都存在,则将取到的四个点进行排序,找出两个较大和两个较小的点int minGrpIdx[2] = { 0, 2 };int maxGrpIdx[2] = { 1, 3 };int *tmpMinGrp = minGrpIdx;int *tmpMaxGrp = maxGrpIdx;if (iRefPointLuma[tmpMinGrp[0]] > iRefPointLuma[tmpMinGrp[1]]) xExchange(tmpMinGrp[0], tmpMinGrp[1], int);if (iRefPointLuma[tmpMaxGrp[0]] > iRefPointLuma[tmpMaxGrp[1]]) xExchange(tmpMaxGrp[0], tmpMaxGrp[1], int);if (iRefPointLuma[tmpMinGrp[0]] > iRefPointLuma[tmpMaxGrp[1]]) xExchange(tmpMinGrp, tmpMaxGrp, int *);if (iRefPointLuma[tmpMinGrp[1]] > iRefPointLuma[tmpMaxGrp[0]]) xExchange(tmpMinGrp[1], tmpMaxGrp[0], int);assert(iRefPointLuma[tmpMaxGrp[0]] >= iRefPointLuma[tmpMinGrp[0]]);assert(iRefPointLuma[tmpMaxGrp[0]] >= iRefPointLuma[tmpMinGrp[1]]);assert(iRefPointLuma[tmpMaxGrp[1]] >= iRefPointLuma[tmpMinGrp[0]]);assert(iRefPointLuma[tmpMaxGrp[1]] >= iRefPointLuma[tmpMinGrp[1]]);//两个较小的点求平均,得到最小点xMin = (iRefPointLuma[tmpMinGrp[0]] + iRefPointLuma[tmpMinGrp[1]] + 1) >> 1;yMin = (iRefPointChroma[tmpMinGrp[0]] + iRefPointChroma[tmpMinGrp[1]] + 1) >> 1;//两个较大的点求平均,得到最大点xMax = (iRefPointLuma[tmpMaxGrp[0]] + iRefPointLuma[tmpMaxGrp[1]] + 1) >> 1;yMax = (iRefPointChroma[tmpMaxGrp[0]] + iRefPointChroma[tmpMaxGrp[1]] + 1) >> 1;}

②如果上边存在,但是左边不存在,则只取上一行前两个采样点最为最大最小点

else if (bAboveAvaillable){//如果只有上一行可用,则只从前两个点中找出最大和最小点for (int k = 0; k < 2; k++){if (iRefPointLuma[k] > xMax){xMax = iRefPointLuma[k];yMax = iRefPointChroma[k];}if (iRefPointLuma[k] < xMin){xMin = iRefPointLuma[k];yMin = iRefPointChroma[k];}}}

③如果左边存在,但是上边不存在,则只取左一列前两个采样点最为最大最小点

else if (bLeftAvaillable){//如果只有左一列可用,则只从后两个点中找出最大和最小点for (int k = 2; k < 4; k++){if (iRefPointLuma[k] > xMax){xMax = iRefPointLuma[k];yMax = iRefPointChroma[k];}if (iRefPointLuma[k] < xMin){xMin = iRefPointLuma[k];yMin = iRefPointChroma[k];}}}

三、用最大最小点计算线性模型的参数a,b,shift:

这部分和VTM中的基本类似,基本是照搬过来的,我就直接放代码了

if (bLeftAvaillable || bAboveAvaillable){*a = 0;*iShift = 16;int diff = xMax - xMin;int add = 0;int shift = 0;if (diff > 64){shift = (uiInternalBitDepth > 8) ? uiInternalBitDepth - 6 : 2;add = shift ? 1 << (shift - 1) : 0;diff = (diff + add) >> shift;if (uiInternalBitDepth == 10){assert(shift == 4 && add == 8); // for default 10bit}}if (diff > 0){*a = ((yMax - yMin) * g_aiTscpmDivTable64[diff - 1] + add) >> shift;}*b = yMin - (((*a) * xMin) >> (*iShift));}if (!bLeftAvaillable && !bAboveAvaillable){*a = 0;*b = 1 << (uiInternalBitDepth - 1);*iShift = 0;return;}

AVS之HPM3.2代码学习笔记1:TSCPM技术的原理和代码实现相关推荐

  1. 深度学习代码学习笔记(一)——阶跃函数与激活函数的python代码实现

    今天正式开始学习深度学习,看的书是<深度学习入门--基于python的理论与实现>. 感知机使用阶跃函数作为激活函数,而神经网络使用 sigmoid 函数作为激活函数. 下面分别来用代码实 ...

  2. amazeui学习笔记--css(HTML元素2)--代码Code

    amazeui学习笔记--css(HTML元素2)--代码Code 一.总结 1.行内代码:code标签<code> 2.代码片段:pre标签<pre> 3.限制代码块高度:添 ...

  3. GEE(Google Earth Engine) 代码学习笔记一 快速入门

    GEE 代码学习笔记一 (GEE 基于JavaScript语言和python语言,我记录的是JavaScript语言) 1.GEE 快速入门 quick start. 2.基本语句 - 简单输出 pr ...

  4. frustum pointnets训练代码学习笔记——kitti_object.py

    frustum pointnets训练代码学习笔记--kitti_object.py 本文记录了博主学习frustum pointnets过程中遇到的2D和3D数据库显示程序.为了画出输出结果,博主希 ...

  5. GEE (Google Earth Engine)最基础代码学习笔记三

    GEE (Google Earth Engine)代码学习笔记三 本次学习核心为:将JavaScript objects and primitives放入Earth Engine 容器传到服务器,并处 ...

  6. DSB2017项目grt123代码学习笔记一:项目基本情况

    DSB2017项目grt123代码学习笔记一:项目基本情况 Kaggle上Data Science Bowl 2017年肺结节检测比赛第一名grt123团队的算法. github地址:https:// ...

  7. 【深度学习】搞懂 Vision Transformer 原理和代码,看这篇技术综述就够了

    作者丨科技猛兽 编辑丨极市平台 导读 本文对Vision Transformer的原理和代码进行了非常全面详细的解读,一切从Self-attention开始.Transformer的实现和代码以及Tr ...

  8. Apollo星火计划学习笔记——Apollo开放空间规划算法原理与实践

    文章目录 前言 1. 开放空间规划算法总体介绍 1.1 Task: OPEN_SPACE_ROI_DECIDER 1.2 Task: OPEN_SPACE_TRAJECTORY_PROVIDER 1. ...

  9. PE病毒学习笔记——初识感染技术 (转自看雪学院)

    [分享]PE病毒学习笔记--初识感染技术 <script type="text/javascript"></script>   标 题: [分享]PE病毒学 ...

最新文章

  1. (44)MessageBoxA 监视器(过写拷贝,不使用 shellcode 注入)
  2. php-calendar,PHPCalendar的函数简介
  3. 实现PageProcessor
  4. OCP大会 | DCOS – 面向数据中心的运营操作系统(附PPT)
  5. Hadoop生态圈-Hbase的API常见操作
  6. Linux命令之查看文件内容
  7. Android开发笔记(一百六十七)Android8.0的画中画模式
  8. c语言蓝桥删除多余的括号,蓝桥杯 括号问题
  9. 最常见的Java框架有哪些?
  10. 现在出纳记账手写还是用计算机,请问:出纳现金日记账和银行日记账是否一定要用手写归档能否用电脑打印归档?...
  11. SQL简体转繁体互换(常用汉字词组)
  12. 听说学习是件苦差事——Linux第一天
  13. 高尔顿与回归分析的起源
  14. 老男孩javascript实战源码
  15. 强烈鄙视中国教育制度
  16. 三菱FX3U PID恒速控制变频器实例 编码器测电机转速
  17. 达尔优键盘的上下左右变成了ASDW
  18. C#中的延时函数sleep怎么使用
  19. 这些面试题你会怎么答?
  20. 和可乐geek学python(02)

热门文章

  1. 3884: 上帝与集合的正确用法 —— 欧拉降幂
  2. SpringMVC中的@InitBinder注解【记录】
  3. linux视频渲染器,OctaneRender Linux版
  4. 虚拟机中 Linux 连不上网原因
  5. 蜗牛星际做无盘服务器,打造蜗牛星际NAS一:安装WINSERVER2019,已无上车价值!...
  6. 《罗小黑战记》:师父你转身离开的那一刻,像极了爱情
  7. 家用洗地机哪种好?怎么选购家用洗地机
  8. python全局变量的声明和使用
  9. 最新版python教程_Python入门教程完整版(懂中文就能学会)
  10. 警惕安全漏洞,如何提高指纹识别的安全性?