理论方面的知识在这里不详细讲述,毕书的222页和264标准上的8.4.2.2.1章节都有非常详细的说明。这里,我主要讲的是程序是如何使具体代码对应理论公式。

void get_block(int ref_frame, StorablePicture **list, int x_pos, int y_pos, struct img_par *img, int block[BLOCK_SIZE][BLOCK_SIZE])

函数一开始定义了6抽头系数,这个很容易明白。接着给6个变量赋值,这边我们来看下这6个变量的物理含义。

static const int COEF[6] = { 1, -5, 20, 20, -5, 1 };

dx = x_pos&3;

dy = y_pos&3;

x_pos = (x_pos-dx)/4;

y_pos = (y_pos-dy)/4;

maxold_x = dec_picture->size_x-1;

maxold_y = dec_picture->size_y-1;

上图中,我已经标出了,现在说明一下,红色填充块表示整像素点,蓝色填充点2表示红色填充点1在前一帧中的预测点。所以:

dx表示预测点距离自己最近的左上整像素点的横坐标(1/4像素单位)。

dy表示预测点距离自己最近的左上整像素点的纵坐标(1/4像素单位)。

x_pos表示离预测点最近的左上整像素点相对于图像左上顶点的横坐标(整像素单位)。

y_pos表示离预测点最近的左上整像素点相对于图像左上顶点的纵坐标(整像素单位)。

maxold_x表示程序中图像的宽最大值。

maxold_y表示程序中图像的高最大值。

接下来我们先总体看一下函数中是如何处理内插像素的,如下图,图中已经有简单说明,我就不在重复。下面,我们就将这6种情况一一分析。

情况一:预测点正好落在整像素点上,即0区域

if (dx == 0 && dy == 0)

{

}

这一部分是最简单的,因为正好预测点落在了整像素点上,所以也不需要任何的内插动作,直接把相关的4x4块(下图中在黑框内的16个整像素点)拷贝到当前丢失块中。

情况二:预测点落在图中的1_2_3区域

if (dy == 0)

{

if ((dx&1) == 1)

{

}

}

我们看到这个区域含有3个内插像素点,其中1点和3点是1/4像素点,而2点是1/2像素点,所以这边代码先进行6抽头插值,接着就有了这个判断if ((dx&1) == 1),作用就是如果落在了1点或者3点这样的1/4像素点,那么就要继续进行双线性插值。

情况三:预测点落在图中的4_8_12区域

else if (dx == 0)

{

if ((dy&1) == 1)

{

}

}

这部分跟情况二的类似,我就不重复,看下图即可。

情况四:预测点落在图中的6_10_14区域

else if (dx == 2)

{

if ((dy&1) == 1)

{

}

}

我们看到这个区域也含有3个内插像素点,其中6点和14点是1/4像素点,而10点是1/2像素点,所以这边代码先进行6抽头插值,接着就有了这个判断if ((dy&1) == 1),作用就是如果落在了6或者14这样的1/4像素点,那么就要继续进行双线性插值。但是这边的计算显然要比上面的情况复杂,因为中间这个1/2像素点要通过附近的1/2像素点进行6抽头插值才能得到,所以首先肯定要得到这些附近的1/2像素点。

对于图中上方的10像素点是通过abcdef这6个半像素的中间量进行6抽头插值得到,而对于下方的10像素点则是通过defghi这6个半像素的中间量进行6抽头插值得到。因为我们知道get_block处理基本单位的是4x4的整像素块,所以这边tmp_res[4][9]为什么需要9个元素,我想在这里就明白了,以tmp_res[0][0]~tmp_res[0][8]为例,分别存储的就是abcdefghi这9个需要用到的半像素的中间量。其他部分我想对照了标准也就没有什么问题了。

情况五:预测点落在图中的9_10_11区域

else if (dy == 2)

{

if ((dx&1) == 1)

{

}

}

这部分跟情况四的类似,我就不重复,看下图即可。

情况六:预测点落在图中的5_7_13_15区域

else

{

}

这一区域的点都是1/4像素点,计算也有些特殊,是通过对角线上的半像素点进行双线性插值得到,所以,程序中两个for循环就是计算这些半像素点,也就是下图中绿色填充点。

附录

注意点一:

程序的一开始有这么一段代码,请注意:

if (dec_picture->mb_field[img->current_mb_nr])

maxold_y = dec_picture->size_y/2 - 1;

这边是在判断如果为场图像,那么高度只有帧图像的一半。

注意点二:

图中的蓝色填充块是我们需要插值的1/2像素点,一般情况,我们取半像素点同一纵坐标上的左右各3个最近整像素点,但是明显此时右边已经到了图像的边界,缺2个整像素点,那么此时参考代码中的做法就是用d点的像素值去人为的补两个出来,即d1=d2=d,从而来完成6抽头插值。

参考:http://blog.csdn.net/zhangji1983/article/details/1502035

JM8.6之get_block() 1/4亮度像素内插详述相关推荐

  1. AVS 分像素运动估计优化算法

    -249- AVS 分像素运动估计优化算法 杨涵悦 1,张兆杨1,滕国伟2 (1. 上海大学通信学院,上海 200072:2. 上海广电(集团)有限公司中央研究院,上海 200233) 摘要:针对AV ...

  2. OpenCV调整图像的亮度

    OpenCV调整图像的亮度 像素越靠近0图像越按,越靠近255,图像越亮,所以调整图片的亮度也就是调整每个像素点数值的大小. 原图 代码 public class DemoMat {static{Sy ...

  3. FFmpeg之视频封装格式、流媒体协议、视频编解码协议和传输流格式、时间戳和时间基、视频像素数据

    通用视频分析工具:Mediainfo.Elecard StreamEye(视频编码分析工具); 视频封装格式: ********************MP4****************** MP ...

  4. A Convolutional Neural Network Approach for Half-Pel Interpolation in Video Coding一视频编码中半像素插值的卷积神经网络

    摘要 - 运动补偿是视频编码中的基本技术,用于消除视频帧之间的时间冗余.为了进一步提高编码效率,已经使用了子像素运动补偿,其需要对分数样本进行插值.视频编码标准通常采用源自信号处理理论的固定插值滤波器 ...

  5. 亮度与色阶看懂直方图

    亮度与色阶看懂直方图 灰度模式 图像菜单-模式-灰度.通道只有一个灰度通道 明暗对比 亮度/对比度命令 图像菜单-调整-亮度对比度 直方图-色阶(Ctrl+L) X轴明度的变化Y轴像素的数量.带有坡度 ...

  6. 最近很火的最新一代国际视频标准 VVC 到底是什么?阿里专家为你揭秘

    作者 | 叶琰,阿里巴巴达摩院XG实验室视频标准团队负责人 责编 | 夕颜 头图 | CSDN付费下载自视觉中国 2020年7月1日晚上(日内瓦时间),第十九次JVET会议在线上落下帷幕,新一代国际视 ...

  7. 都说 WebP 厉害,究竟厉害在哪里?

    之前在< WebP 的前世今生 >一文中,介绍了 WebP 图片格式是由 Google 基于 VP8 视频编码格式研发的,同时提供有损压缩和无损压缩两种格式,那么今天就来看看 WebP 有 ...

  8. 利用OpenCV进行图像的轮廓检测

    简 介: 本文对于OpenCV中的轮廓检测算法进行了讨论,可以看到一些基于轮廓检测的应用.接着对四种不同的提取方式的结果进行了讨论.你还了解了如何将轮廓进行绘制的方法. 关键词: 轮廓检测,二值化 § ...

  9. 三. H.264简介

    一. H.264视频编码标准 H.264视频编码标准是ITU-T与MPEG合作产生的又一巨大成果,自颁布之日起就在业界产生了巨大影响.严格地讲,H.264标准是属于MPEG-4家族的一部分,即MPEG ...

  10. 【opencv】20.直方图均衡化的数学原理

    本文只讲数字图像处理,即离散化后的公式,至于积分形式的分析,网上很多. 具体的数学推导可以参考这篇博客直方图均衡化. 如果想自己代码实现直方图均衡化,相关源代码可以参考(不使用api)使用C++实现彩 ...

最新文章

  1. java感谢_这三天看完Java入门第一季和第二季的成果!纪念一下!感谢Java入门的作者!...
  2. 在ubuntu系统中使用dpkg命令安装后缀名为deb的软件包
  3. a.ou、coff、elf三种文件格式
  4. 解决pycharm创建github工程但push失败的问题
  5. jsoup 标准化html代码,Jsoup从元素抽取属性,文本和HTML
  6. JavaScript调用其他函数中的变量
  7. (MoMoCMS教程11)页面的SEO优化与外链
  8. Elasticsearch2.x Breaking changes
  9. Codeforces 527C Glass Carving
  10. 指定的颜色信息显示方法
  11. 投入产出比增长2倍以上!银泰抛弃传统数据库转投阿里云PolarDB
  12. Android车机之TextToSpeech
  13. stm32最小系统原理图
  14. 阿里云创建AccessKey
  15. 4、使用bean的scop属性来配置bean的作用域
  16. 高速PCB基础——电阻,电容,电感(第三讲)
  17. 垂直水平居中的三种实现方式
  18. OpenCV Java入门五 结合摄像头识脸和拍照
  19. 面试智力题:如何才能证明自己不怕老婆
  20. ZABBIX修改端口流量监控阀值

热门文章

  1. C#中的常量、类型推断和作用域
  2. photon四种同步方式_Map 四种同步方式的性能比较
  3. 如何把握好 transition 和 animation 的时序,创作描边按钮特效...
  4. 流式布局和viewport
  5. Redis 配置文件参数说明
  6. java:eclipse:windows开发环境log4j系统找不到指定的路径
  7. 简单理解javascript中的原型对象,实现对之间共享属性和行为
  8. java--Hibernate实现分页查询
  9. 十天学会php之第二天
  10. 理解iOS 8中的Self Sizing Cells和Dynamic Type