双线性插值(Bilinear Interpolation)[通俗易懂]

双线性插值(Bilinear Interpolation)[通俗易懂]双线性插值(BilinearInterpolation)  假设源图像大小为mxn,目标图像为axb。那么两幅图像的边长比分别为:m/a和n/b。注意,通常这个比例不是整数,编程存储的时候要用浮点型。目标图像的第(i,j)个像素点(i行j列)可以通过边长比对应回源图像。其对应坐标为(i*m/a,j*n/b)。显然,这个对应坐标一般来说不是整数,而非整数的坐标是无法在图像这种离散数据上使用…

大家好,又见面了,我是你们的朋友全栈君。

双线性插值(Bilinear Interpolation)

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

若图像为灰度图像,那么(i,j)点的灰度值的数学计算模型是:

                                                                      f(x,y)=b1+b2x+b3y+b4xy

如图,已知Q12,Q22,Q11,Q21,但是要插值的点为P点,这就要用双线性插值了,首先在x轴方向上,对R1和R2两个点进行插值,这个很简单,然后根据R1和R2对P点进行插值,这就是所谓的双线性插值。在数学上,双线性插值是有两个变量的插值函数的线性插值扩展,其核心思想是在两个方向分别进行一次线性插值。

                                                        clip_image001

        假如我们想得到未知函数 f 在点 P = (x, y) 的值,假设我们已知函数 f 在 Q11 = (x1, y1)、Q12 = (x1, y2), Q21 = (x2, y1) 以及 Q22 = (x2, y2) 四个点的值。

首先在 x 方向进行线性插值,得到

双线性插值(Bilinear Interpolation)[通俗易懂]

双线性插值(Bilinear Interpolation)[通俗易懂]

然后在 y 方向进行线性插值,得到

双线性插值(Bilinear Interpolation)[通俗易懂]

这样就得到所要的结果 f(x, y),

双线性插值(Bilinear Interpolation)[通俗易懂]

双线性插值(Bilinear Interpolation)[通俗易懂]

如果选择一个坐标系统使得 f 的四个已知点坐标分别为 (0, 0)、(0, 1)、(1, 0) 和 (1, 1),那么插值公式就可以化简为

f(x,y) \approx f(0,0) \, (1-x)(1-y) + f(1,0) \, x(1-y) + f(0,1) \, (1-x)y + f(1,1) xy.

或者用矩阵运算表示为

f(x,y) \approx \begin{bmatrix}1-x & x \end{bmatrix} \begin{bmatrix}f(0,0) & f(0,1) \\f(1,0) & f(1,1) \end{bmatrix} \begin{bmatrix}1-y \\y \end{bmatrix}

这种插值方法的结果通常不是线性的,线性插值的结果与插值的顺序无关。首先进行 y 方向的插值,然后进行 x 方向的插值,所得到的结果是一样的。

python代码实现

#!/bin/python
import numpy as np
from scipy.misc import imread, imshow
from scipy import ndimage
 
def GetBilinearPixel(imArr, posX, posY):
	out = []
 
	#Get integer and fractional parts of numbers
	modXi = int(posX)
	modYi = int(posY)
	modXf = posX - modXi
	modYf = posY - modYi
	modXiPlusOneLim = min(modXi+1,imArr.shape[1]-1)
	modYiPlusOneLim = min(modYi+1,imArr.shape[0]-1)
 
	#Get pixels in four corners
	for chan in range(imArr.shape[2]):
		bl = imArr[modYi, modXi, chan]
		br = imArr[modYi, modXiPlusOneLim, chan]
		tl = imArr[modYiPlusOneLim, modXi, chan]
		tr = imArr[modYiPlusOneLim, modXiPlusOneLim, chan]
 
		#Calculate interpolation
		b = modXf * br + (1. - modXf) * bl
		t = modXf * tr + (1. - modXf) * tl
		pxf = modYf * t + (1. - modYf) * b
		out.append(int(pxf+0.5))
 
	return out
 
if __name__=="__main__":
 
	im = imread("test.jpg", mode="RGB")
	enlargedShape = list(map(int, [im.shape[0]*1.6, im.shape[1]*1.6, im.shape[2]]))
	enlargedImg = np.empty(enlargedShape, dtype=np.uint8)
	rowScale = float(im.shape[0]) / float(enlargedImg.shape[0])
	colScale = float(im.shape[1]) / float(enlargedImg.shape[1])
 
	for r in range(enlargedImg.shape[0]):
		for c in range(enlargedImg.shape[1]):
			orir = r * rowScale #Find position in original image
			oric = c * colScale
			enlargedImg[r, c] = GetBilinearPixel(im, oric, orir)
 
	imshow(enlargedImg)
 

参考:

https://www.cnblogs.com/kk17/p/9989984.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/132305.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 什么是是JAVA构造函数

    什么是是JAVA构造函数每创建一个类的实例都去初始化它的所有变量是乏味的。如果一个对象在被创建时就完成了所有的初始工作,将是简单的和简洁的。因此,Java在类里提供了一个特殊的成员函数,叫做构造函数(Constructor)。一个构造函数是对象被创建时初始对象的成员函数。它具有和它所在的类完全一样的名字。一旦定义好一个构造函数,创建对象时就会自动调用它。构造函数没有返回类型,即使是void类型也没有。这是因为…

    2022年7月8日
  • CentOS7修改IP地址后无法ping通问题记录[通俗易懂]

    CentOS7修改IP地址后无法ping通问题记录在键入ifconfigenp0s3192.168.56.2后,在cmd中无法ping通此IP地址解决办法:键入sudoifconfigenp0s3192.168.56.2

    2022年4月12日
  • vmware虚拟机上安装win7系统_window10 虚拟机

    vmware虚拟机上安装win7系统_window10 虚拟机文章目录一、前言二、VMware下载三、XP系统镜像下载四、创建XP虚拟机一、前言最近需要搞windows系统兼容测试,根据数据显示,目前市面上占比TOP3的系统如下:排名系统占比1win7sp159.25%2win1029.83%3xpsp38.87%4其他–没想到2021年了,xp系统还占了8.87%。我自己本机是win10,不想安装双系统,决定弄个xp虚拟机好了。在网上下载了一个xp的iso镜像文件,使用虚拟机加载却提示:

    2022年8月16日
  • 正则表达式替换自身「建议收藏」

    正则表达式替换自身「建议收藏」一、问题:将文本中所有[XXX]替换成XXX(XXX包含字母数字下划线),就是将中括号去掉了例如:[PK_Roles]   替换成:PK_Roles二、解答:正则式:\[([0-9a-zA-Z_]*)\]加圆括号表示分组并作为“反向索引”,[0-9a-zA-Z_]*表示多个数字字母下划线替换式:\1\1表示引用第1个组,\1在有些环境中是$1三、常用正则表达式空行

    2022年5月16日
  • UAT SIT QAS DEV PET「建议收藏」

    UAT SIT QAS DEV PET「建议收藏」UAT:UserAcceptanceTesting用户验收测试SIT:SystemIntegrationTesting系统集成测试PET:PerformanceEvaluationTest性能鉴定试验DEV:DevelopmentSystem开发系统QAS:QualityAssurancesystem质量保证体系PRO:professional专…

    2022年6月28日
  • Java 8 中 LocalDate 与Date 互相转换

    Java 8 中 LocalDate 与Date 互相转换//01.java.util.Date–>java.time.LocalDateTimepublicvoidUDateToLocalDateTime(){java.util.Datedate=newjava.util.Date();Instantinstant=date.toInstant();ZoneIdzone=ZoneId.systemDef…

    2022年10月3日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号