JM8.6之get_block() 1/4亮度像素内插详述
理论方面的知识在这里不详细讲述,毕书的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亮度像素内插详述相关推荐
- AVS 分像素运动估计优化算法
-249- AVS 分像素运动估计优化算法 杨涵悦 1,张兆杨1,滕国伟2 (1. 上海大学通信学院,上海 200072:2. 上海广电(集团)有限公司中央研究院,上海 200233) 摘要:针对AV ...
- OpenCV调整图像的亮度
OpenCV调整图像的亮度 像素越靠近0图像越按,越靠近255,图像越亮,所以调整图片的亮度也就是调整每个像素点数值的大小. 原图 代码 public class DemoMat {static{Sy ...
- FFmpeg之视频封装格式、流媒体协议、视频编解码协议和传输流格式、时间戳和时间基、视频像素数据
通用视频分析工具:Mediainfo.Elecard StreamEye(视频编码分析工具); 视频封装格式: ********************MP4****************** MP ...
- A Convolutional Neural Network Approach for Half-Pel Interpolation in Video Coding一视频编码中半像素插值的卷积神经网络
摘要 - 运动补偿是视频编码中的基本技术,用于消除视频帧之间的时间冗余.为了进一步提高编码效率,已经使用了子像素运动补偿,其需要对分数样本进行插值.视频编码标准通常采用源自信号处理理论的固定插值滤波器 ...
- 亮度与色阶看懂直方图
亮度与色阶看懂直方图 灰度模式 图像菜单-模式-灰度.通道只有一个灰度通道 明暗对比 亮度/对比度命令 图像菜单-调整-亮度对比度 直方图-色阶(Ctrl+L) X轴明度的变化Y轴像素的数量.带有坡度 ...
- 最近很火的最新一代国际视频标准 VVC 到底是什么?阿里专家为你揭秘
作者 | 叶琰,阿里巴巴达摩院XG实验室视频标准团队负责人 责编 | 夕颜 头图 | CSDN付费下载自视觉中国 2020年7月1日晚上(日内瓦时间),第十九次JVET会议在线上落下帷幕,新一代国际视 ...
- 都说 WebP 厉害,究竟厉害在哪里?
之前在< WebP 的前世今生 >一文中,介绍了 WebP 图片格式是由 Google 基于 VP8 视频编码格式研发的,同时提供有损压缩和无损压缩两种格式,那么今天就来看看 WebP 有 ...
- 利用OpenCV进行图像的轮廓检测
简 介: 本文对于OpenCV中的轮廓检测算法进行了讨论,可以看到一些基于轮廓检测的应用.接着对四种不同的提取方式的结果进行了讨论.你还了解了如何将轮廓进行绘制的方法. 关键词: 轮廓检测,二值化 § ...
- 三. H.264简介
一. H.264视频编码标准 H.264视频编码标准是ITU-T与MPEG合作产生的又一巨大成果,自颁布之日起就在业界产生了巨大影响.严格地讲,H.264标准是属于MPEG-4家族的一部分,即MPEG ...
- 【opencv】20.直方图均衡化的数学原理
本文只讲数字图像处理,即离散化后的公式,至于积分形式的分析,网上很多. 具体的数学推导可以参考这篇博客直方图均衡化. 如果想自己代码实现直方图均衡化,相关源代码可以参考(不使用api)使用C++实现彩 ...
最新文章
- java感谢_这三天看完Java入门第一季和第二季的成果!纪念一下!感谢Java入门的作者!...
- 在ubuntu系统中使用dpkg命令安装后缀名为deb的软件包
- a.ou、coff、elf三种文件格式
- 解决pycharm创建github工程但push失败的问题
- jsoup 标准化html代码,Jsoup从元素抽取属性,文本和HTML
- JavaScript调用其他函数中的变量
- (MoMoCMS教程11)页面的SEO优化与外链
- Elasticsearch2.x Breaking changes
- Codeforces 527C Glass Carving
- 指定的颜色信息显示方法
- 投入产出比增长2倍以上!银泰抛弃传统数据库转投阿里云PolarDB
- Android车机之TextToSpeech
- stm32最小系统原理图
- 阿里云创建AccessKey
- 4、使用bean的scop属性来配置bean的作用域
- 高速PCB基础——电阻,电容,电感(第三讲)
- 垂直水平居中的三种实现方式
- OpenCV Java入门五 结合摄像头识脸和拍照
- 面试智力题:如何才能证明自己不怕老婆
- ZABBIX修改端口流量监控阀值
热门文章
- C#中的常量、类型推断和作用域
- photon四种同步方式_Map 四种同步方式的性能比较
- 如何把握好 transition 和 animation 的时序,创作描边按钮特效...
- 流式布局和viewport
- Redis 配置文件参数说明
- java:eclipse:windows开发环境log4j系统找不到指定的路径
- 简单理解javascript中的原型对象,实现对之间共享属性和行为
- java--Hibernate实现分页查询
- 十天学会php之第二天
- 理解iOS 8中的Self Sizing Cells和Dynamic Type