双线性插值 python,图像的双线性插值
双线性插值,也称为双线性插值。数学上,双线性插值是二元插值函数的线性插值扩展,其核心思想是分别在两个方向上进行线性插值。本文将利用Python实现二维图像的双线性插值。有兴趣的可以了解一下。
00-1010插值(最近插值)、双三次插值(双线性插值)、双线性插值python实现了在对二维数据进行大小调整/映射/坐标转换时,往往会将原来的整数坐标转换成小数坐标。对于非整数坐标值,一种直观有效的插值方法是双线性插值。
目录
双线性插值,也称为双线性插值。数学上,双线性插值是二元插值函数的线性插值扩展,其核心思想是分别在两个方向上进行线性插值。
双线性插值作为数值分析中的一种插值算法,广泛应用于信号处理、数字图像和视频处理中。
假设我们有一种情况,需要在四个相邻的平方整数点(A,B,C,D)的坐标中间(平方范围内)选择一个点(A,B)取近似值。
这时我们知道了四个点VA,VB,VC,VD的值。给定十进制坐标E(a,b),0a,b1,如何插值点E的值?解决类似问题的方法统称为插值法。上图所示的公式就是双线性插值。
插值简介
最简单的方法之一是最近邻法,直接取最接近当前点的点的值作为插值结果:
Roundroundround就是取整操作,简单快速,但往往不够精细。
最近邻法 (Nearest Interpolation)
三次插值是用原图像中的16(4*4)个点来计算新图像中的一个点。效果不错,但是计算成本太高。
双三次插值 (Bicubic interpolation)
用一个点插值太粗糙,16个点太繁琐,所以用EEE点周围四个点的数值来近似求解。这是平衡计算成本和插值效果的折中方案,也是各大变换库默认的插值操作。
双线性插值 (Bilinear Interpolation)
通过观察上面的动图(可以用手移动),可以清楚地看到双线性插值的本质是将四个角的值按照正方形面积的比例进行线性加权的结果。
嗯,一句话就讲完了数学的核心部分。
既然你理解了本质,数学公式就很容易写了:
双线性插值
在实现上,当然for循环方法可以解决所有问题,但最后并不优雅。我们尝试使用numpy运算来完成双线性插值。
假设原图像,变换后的十进制坐标X矩阵x_grid和Y矩阵y_grid,那么下面的双线性_by_meshgrid函数可以用于快速双线性插值,边界已经处理过了,可以放心使用。
定义双线性网格(图像,x网格,y网格):
# Ia,Wd Ic,Wb
#(楼层x,楼层y)(单元x,楼层y)
#
# (x,y)
#
# Ib,Wc Id,Wa
#(楼层x,单元y)(单元x,单元y)
#
assert image . shape==x _ grid . shape==y _ grid . sh
ape
assert image.ndim == 2
H, W = image.shape[:2]
floor_x_grid = np.floor(x_grid).astype(int32)
floor_y_grid = np.floor(y_grid).astype(int32)
ceil_x_grid = floor_x_grid + 1
ceil_y_grid = floor_y_grid + 1
if np.max(ceil_x_grid) > W -1 or np.max(ceil_y_grid) > H -1 or np.min(floor_x_grid) < 0 or np.min(floor_y_grid) < 0:
print("Warning: index value out of original matrix, a crop operation will be applied.")
floor_x_grid = np.clip(floor_x_grid, 0, W-1).astype(int32)
ceil_x_grid = np.clip(ceil_x_grid, 0, W-1).astype(int32)
floor_y_grid = np.clip(floor_y_grid, 0, H-1).astype(int32)
ceil_y_grid = np.clip(ceil_y_grid, 0, H-1).astype(int32)
Ia = image[ floor_y_grid, floor_x_grid ]
Ib = image[ ceil_y_grid, floor_x_grid ]
Ic = image[ floor_y_grid, ceil_x_grid ]
Id = image[ ceil_y_grid, ceil_x_grid ]
wa = (ceil_x_grid - x_grid) * (ceil_y_grid - y_grid)
wb = (ceil_x_grid - x_grid) * (y_grid - floor_y_grid)
wc = (x_grid - floor_x_grid) * (ceil_y_grid - y_grid)
wd = (x_grid - floor_x_grid) * (y_grid - floor_y_grid)
assert np.min(wa) >=0 and np.min(wb) >=0 and np.min(wc) >=0 and np.min(wd) >=0
W = wa + wb + wc + wd
assert np.sum(W[:, -1]) + np.sum(W[-1, :]) == 0
wa[:-1, -1] = ceil_y_grid[:-1, -1] - y_grid[:-1, -1]
wb[:-1, -1] = y_grid[:-1, -1] - floor_y_grid[:-1, -1]
wb[-1, :-1] = ceil_x_grid[-1, :-1] - x_grid[-1, :-1]
wd[-1, :-1] = x_grid[-1, :-1] - floor_x_grid[-1, :-1]
wd[-1, -1] = 1
W = wa + wb + wc + wd
assert np.max(W) == np.min(W) == 1
res_image = wa*Ia + wb*Ib + wc*Ic + wd*Id
return res_image
该函数集成在我自己的python库 mtutils
中,可以通过:
pip install mtutils
直接安装,之后可以直接引用:
from mtutils import bilinear_by_meshgrid
以上就是基于Python实现二维图像双线性插值的详细内容,更多关于Python双线性插值的资料请关注盛行IT软件开发工作室其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。