双线性插值实现
在上一篇文章里,介绍了「最邻近差值」的原理与实现https://blog.csdn.net/Wang_Pro/article/details/106583069
这篇想总结一下学到的高级方法「双线性差值」的原理,再比较一下这两种方法的最大不同在哪里
双线性差值
如图:
“双”体现在插值公式在不同轴x,y上的计算次数,简单来说就是:
1)找到一个区间(x1, x2)之间的值x;
2)找到另一个区间(y1, y2)之间的值y;
最后确定点P(x, y)。
第一个问题来了,“什么情况下才需要用到双线性差值呢?”,在放大图像的时候用得到。
所以为了解决这个问题,更精确的问题可以被描述为“如何将放大图片的每个像素通过一定的法则,一一对应到原始图像?”
之前的方法「最邻近差值」在完成对应时是通过将计算完成的坐标四舍五入完成一一对应,例如放大图像中有一个像素点(51, 51)需要判断应该对应哪一个原图像素,假设被放大了2倍,则(51/2, 51/2)–>(25.5, 25.5),小数产生了,「最邻近差值」通过四舍五入的方式将(25.5, 25.5)对应到了原图像的(26, 26),这样的解决方式在放大图像中会出现马赛克,
所以有了更加精确的做法「双线性差值」,放大图像中的像素不确定与哪一个原图像素对应时,我们先找到这个像素被对应到原图的坐标(P+i,Q+j)P,Q表示放大像素中的整数值,i,j代表小数值
接下来,利用(P+i,Q+j)找到这个像素的四邻域:
(P,Q) | (P,Q+1) |
---|---|
(P+1,Q) | (P+1,Q+1) |
将权值赋予四邻域,计算出新值。完事
那么“权值信息怎么获取到呢?”,回答是使用小数值i与j完成,所以解决这个问题,双线性差值最难的问题就被解决了
这里就不放差值公式了,两个像素之间的距离默认是1,且0< i|j <1, 所以ij可以被当作是到4邻域的距离,把到不同像素点的距离称为权值,在合适不过了
所以: f(P+i,Q+j)= (1-i)(1-j)(P,Q) + (i)(1-j)*(P+1,Q)+ (1-i)(j)|(P,Q+1) + (i)(j)*(P+1,Q+1)
通过这个公式就可以计算出新值。
编程思路:
1)读图像的原始信息高、宽,指定放大倍数
2)创建x_index,y_index矩阵
3)计算被放大后的图像的原始矩阵(矩阵内值未确定)
a.对x_index运用差值公式
b.对y_index运用差值公式
4)得到差值公式的整数与小数部分
5)将小数矩阵(h,w)–>(h,w,c)与原图的通道相同
6)使用距离权值公式计算出新坐标