opencv双线性插值缩放图像的理解

'''
title: opencv双线性插值缩放图像的理解
keyword: 图像缩放 插值 双线性插值 opencv
ref: https://www.cnblogs.com/yssongest/p/5303151.html
ref: https://blog.csdn.net/xbinworld/article/details/65660665
ref: https://blog.csdn.net/sinat_33718563/article/details/78825971
ref: https://blog.csdn.net/fengbingchun/article/details/17335477
ref: https://www.cnblogs.com/skyfsm/p/7578302.html
ref: https://blog.csdn.net/allen_sdz/article/details/89166363

上面的文章详细的说明了双线性插值的方法,但是对opencv版本公式
还没有作过多的解读,本文尝试分析下其来历

双线性插值, bi-line-near = bilinear
图像缩放变换时,两个维度可以认为是独立进行的,因此我们任取一个维度,
转换成一维的线性问题分析,这里取x轴:

缩放映射基本公式:srcX = int(dstX * (srcW / dstW) [+0.5])
这个其实就是最近邻(nearest)的公式,+0.5是可选的,表示四舍五入
以下将srcW / dstW记作k,srcX记作y,dstX记作x
即:y = int(kx + 0.5)

如果将其变以下公式:
y = F(z), z = kx
可以简单记为: y = kx
函数F(z)表示在z处进行浮点场合的插值处理(z是一个浮点数):
但当z是整值(小数点后为0)时,将等效于不插值,等效于最近邻算法
这是不完全合理的
典型地,取x = 0:
	k=2时,z=0,插0处值,但是此时应该插0、1位置的值  -------------不合理
	k = 3时,z = 0,插0处值,但是此时插0,1,2的值比较合理,简单点,插1处的值也凑合(中心对称) ----不合理
	但是当k=1时,图像等大小缩放,不应该插值,否则图像会随着缩放,不断模糊 ----合理
	k<1时,图像放大,其等于于图像缩小的逆变换,这里不做过多讨论    ------- 和k=2,k=3一样,不合理(逆变换)

基于上面的讨论,我们可以看出,某些情况下,对z产生一个偏移比较好
于是opencv使用了上面中心对称的办法,即
x = 0
k=1,插0处的值
k=2, 插0.5处的值(取0.5,表示此时两边的像素权重一样)
k=3,插1处的值   (插0,1,2最合理,但是双线性插值办不到,且会变得很复杂)
k=4, 插1.5处的值 (也就是放弃0,3像素,只取1,2像素)
k=5,插2处的值
...
k其实就是x变化单位像素时,原图像变化的像素个数
中心对称的思想就是尽量取[nk, (n+1)k]区间中心位置nk+k/2处的值
这样就避免了取值都靠近nk一端
配合双线性插值,在低倍数的缩放时,效果应该还是有的,高倍数缩放应该效果不明显(个人理解)
最后,总结公式:(k-1) * 0.5

当x >= 1(x是int),同样需要加上上述的公式,即offset = (k-1) * 0.5
综合:y = F(z), z = kx + offset, offset = (k-1) * 0.5
可以简记作:y = kx + (k-1)*0.5

对其求反函数:x = 1/k * y + (1-1/k) * 0.5
1/k其实就是放大变化时的比例,和缩写变换公式完全等价

'''

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值