FPGA series # 双线性插值的图像缩放 【算法原理】

准备写双线性插值的图像缩放,先从算法原理开始。 查阅资料和一点自己的理解。

双线性插值的图像缩放,两方面的理解:线性插值----->双线性插值;图像缩放。具体定义在百度百科都是有的:双线性插值图像缩放
  百度百科上的解释比较偏向于数学研究方面,所以研究起来也比较困难,大概了解一下推算过程。因为这里是用作图像处理,所以仅代入当一种计算规律使用。

首先来了解一下算法过程
Bilinear_interpolation
  假如我们想得到未知函数 f 在点 P=( x, y) 的值,假设我们已知函数 f 在 Q11 = ( x1, y1 ) , Q12 = ( x1, y2 ) , Q21 = ( x2, y1 ) , 及 Q22 = ( x2, y2 )四个点的值。
  首先在 x 方向进行线性插值,得到1
  然后在 y 方向进行线性插值,得到
2
  这样就得到所要的结果 f( x, y ),3
  这里的一堆公式仅参考用。

再来看看图像缩放是怎么处理的
  图像处理中,假设源图像大小为mxn,目标图像为axb。那么两幅图像的边长比分别为:m/a和n/b。注意,通常这个比例不是整数,编程存储的时候要用浮点型。目标图像的第(i,j)个像素点(i行j列)可以通过边长比对应回源图像。其对应坐标为(i * m / a , j * n / b)。
  显然,这个对应坐标一般来说不是整数,而非整数的坐标是无法在图像这种离散数据上使用的。双线性插值通过寻找距离这个对应坐标最近的四个像素点,来计算该点的值(灰度值或者RGB值)。如果你的对应坐标是(2.5,4.5),那么最近的四个像素是(2,4)、(2,5)、(3,4),(3,5)。这里根据这四个点,按照上面的公式计算出来对应坐标的像素。

现在具体描述这个浮点型的处理过程,且推出最后的实用公式:(注:这里的i,j和上面的i,j不为同一个)
  对于一个目的像素,设置坐标通过反向变换得到的浮点坐标为(i+u,j+v) (其中i、j均为浮点坐标的整数部分,u、v为浮点坐标的小数部分,是取值[0,1)区间的浮点数),则这个像素得值 f(i+u,j+v) 可由原图像中坐标为 (i,j)、(i+1,j)、(i,j+1)、(i+1,j+1)所对应的周围四个像素的值决定,即:

f(i+u,j+v) = (1-u)(1-v)f(i,j) + (1-u)vf(i,j+1) + u(1-v)f(i+1,j) + uvf(i+1,j+1)
  
  其中f(i,j)表示源图像(i,j)处的的像素值,以此类推。这里与上述公式不同的地方在于,在图像缩放中,上述的x2-x1和y2-y1均等于1,所以这里不写。可以自己随便代个数验证。

整理的该图像缩放的算法思路如下
4
即,用目标图像的像素点坐标算出该点像素值。

今天只是了解了一下算法,整理了思路。后面要考虑方案,注意几个问题:

  1. FPGA是流水地并行地处理数据;
  2. 源图像数据输出到计算模块时,四个坐标点是只用一个或者两个RAM,一个一个输出,前面的输出的坐标延迟一两个clock等后面输出的坐标一起进入计算模块处理,还是用四个RAM,一起输出进入计算模块。这里涉及到速度资源的问题。
  3. 边缘问题。源图的四个顶角的点对应它们各自的四个周围坐标点并不全,考虑将源图的第一行、列和最后一行、列向外扩展一组数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值