图像处理中的插值算法

 

    假设有一副图像A,像素为 m×n。如果要将其缩放为原来的a倍变成图像B,其像素为 a*m×a*n=M×N(*代表乘法运算),将会涉及到插值的问题,常见的插值方法有三种最邻近插值、双线性插值、双立方插值。

一、最邻近插值

如图,假设原始图像A为 4×4 的像素,缩放后的图像B为 3×3 的像素。其中A中每个像素块的值我们都已经知道,而B中每个像素块的值都不知道,只要利用图像A求出B中每个像素块的值,我们的工作就完成了。可以一个 一个 的来求,假 如要先求B中第1行,第2列的像素块值的大小  g(1,2)  的话。对于最邻近插值话很简单,找到A图像中某一个像素块的值直接给B就行,重要的是找出要把A中哪一个像素块的值给 g(1,2)。就是用下面的求法。(g(x,y)为B图像中(x,y)处的像素值,f(x,y)为A图像中(x,y)处的像素值)

g(1,2)=f(\frac{1}{3}*4,\frac{2}{3}*4)=f(1.33,2.66)

直接四舍五入得

g(1,2)=f(1,3)

所以只要把A图像中第1行第3列的像素块的值赋值给B图像中第1行第2列的像素块即可,通过这种方式可以求出图像B中所有像素块的值。

推广到一般情况

为求B图像中位于(x,y)处的像素值,则有

g(x,y)=f(\frac{x}{M}*m,\frac{y}{N}*n)=f(\frac{x}{a},\frac{y}{a})           a为缩放倍数,m×n为原始图像大小,M×N为缩放后图像大小

当然如果所求结果不是整数直接四舍五入就好。

双线性插值

    对于最邻近插值还可以这样理解,看下图。由g(x,y)=f(\frac{x}{M}*m,\frac{y}{N}*n)=f(\frac{x}{a},\frac{y}{a})可以得到,图像B中的点(x,y)对应于图像A中的(\frac{x}{a},\frac{y}{a}),假设就是下图中的H点。所谓最邻近插值,就是说图像B中(x,y)点的像素值只和离H点(H点是在图像A中)最近的像素点的值有关,也就是点(i,j)处的像素值。

双线性插值呢,它不仅仅只是和离H点最近的像素点的值有关,而是和H点周围的4个像素点的值都有关。这4个像素点也就是(i,j)、(i+1,j)、(i,j+1)、(i+1,j+1)。具体进行双线性插值的步骤:

1、先进行水平方向的插值,也就是利用上图中(i,j)和(i+1,j)两点的像素值求出X点的像素值;利用(i,j+1)和(i+1,j+1)两点的像素值求出Y点的像素值。(点X、Y、H在一条竖线上,即横坐标相同)

2、再进行竖直方向上的插值,也就是利用XY两点的像素值求出H点的像素值,也就是我们要求的图像B中(x,y)处的像素值。这应该也是为什么这种插值方法叫作双线性插值的原因了吧。

我们首先要把H点的坐标写成这这种形式(i+u,j+v),其中i、j是整数(i,j也代表图像A中的第几个像素点);u、v是小数。至于H点坐标怎么求前面说过。分别把X、Y、H点的像素值记作f(X)f(Y)f(H);同理f(i,j)f(i+1,j)f(i,j+1)、g(if(i+1,j+1)分别代表相应四个位置的像素值。

f(X)=f(i,j)+u\ast (f(i,i+1)-f(i,j))

f(Y)=f(i,j+1)+u\ast (f(i+1,i+1)-f(i,j+1))

f(H)=f(X)+v*(f(Y)-f(X))

当然,你也可以把f(X),f(Y)代入第三个式子得到一个计算公式。(*代表乘法运算)

还可以拿最开始的那个简单例子来计算一下,要求图像B中第1行第2列位置处的像素值。通过g(x,y)=f(\frac{x}{M}*m,\frac{y}{N}*n)=f(\frac{x}{a},\frac{y}{a})可以得到H点的坐标为(1+0.33,2+0.66),所以就是你懂得。太简单懒得写,反正记住f(x,y)是已知的,当然这里的x、y都是整数。最后求出的f(H)也就是我们要找的图像B中第1行第2列位置处的像素值。

双立方插值

未完,待续

  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值