初次开始写博客,想记录下自己在公司实习所做过的事情以及学习到的东西,虽然还是有很多东西不了解也还没做出来,但是也希望这是一种体验。
我于2018.9.3入职进行实习,到现在也快过去两个月了,我在公司进行了轮岗,在大部分岗位都待了几周,现在回到了我应该待的部门—数字IP设计部。其中很多心路感受等有空的时候再一一补上。现在我的任务就是学习图像缩放,一方面我需要一个写论文的方向,另一方面公司说年底会开发这方面的芯片,让我提前做好知识储备。今天就记录一下自己在最近学习中的心得吧。
我所学习的图像缩放采用的算法就是双线性插值,这个算法很古老,自己查到的论文上很多都是2000年左右的,但是可能工程上需要这种稳定的算法把。各种论文中对这种算法的描述和改进很多(因为自己有点偷懒,看的英文的很少)。但是有的论文明显看书来在水,废话不多说,来说说双线性差值吧。
双线性插值最核心的就是那一个公式,放一个图在这里,公式就不编辑了。按照我自己的思路,首先要有缩放因子,然后通过缩放因子对图片拉伸或者缩小。但是在这里我就有一个疑问,是不是有一个寄存器先存住这个初次变化的图像呢?然后在这个初次缩放图像的基础上,通过向后映射的方法,计算出新的目标图像每一个像素点的灰度值,这样就得到了新的目标图像。
这个算是算法上的一点记录,那在硬件上怎么实习呢?这也是我现在还很有疑问的地方,先把这些都记录下来,不清楚的点后面再依次解决。
(1) 在硬件上首先要能接受源图像,这时候应该有个FIFO来缓存进来的数据(如果是对图片缩放还好,但是如果是对视频进行缩放需要FIFO能存储的住高速的视频源)。那么什么时候需要读取数据,什么时候读取第几行数据,这都需要一个控制。
(2) 然后,要从FIFO中将源图像读取出来,首先可以进行垂直方向上的插值,这样的话就需要读出源图像中的两行数据,这两行数据放置在两个RAM中。那么在这个拥有两个RAM的缓冲区中,还需要一个步长值x,这个步长值我个人是认为承担着两个任务。第一,每个x可以看作是加权系数,来让上下两行数据进行垂直方向上的插值。第二,x整数前面的系数每增加1,就意味着插值的两行要向下移动。比如,原来源数据的是第一第二行,但是x的整数位进位了,那么就需要从FIFO中读取第二第三行了。
(3) 在进行完垂直方向的插值之后,需要再进行水平方向的插值,计算公式不需要列出,但是还有几个要注意的就是水平和垂直方向插值都需要指针,需要告诉我什么时候一行结束了,什么时候整个帧的插值都结束了。
对于硬件怎么设计以及各个寄存器应该怎么配置,现在还处于迷茫状态中。为什么写下这篇博客,主要是最近情感遇到了重大问题,很难受,希望通过整理这些东西让我有一个缓冲,也能让我的注意力有所转移,后面有问题再补充。
原文地址:https://www.cnblogs.com/MU-Ricky/p/9889003.html