×

解析 双线性插值

前端技术网 前端技术网 发表于2024-01-26 19:26:36 浏览3130 评论0

抢沙发发表评论

一、双线性插值法 四个点怎么确定

双线性插值是二维的插值,先把一维的弄懂了会比较好理解二维的;

首先是插值,因为要存储所有的点和点上的值所占的空间比较大,所以就先存一部分点,想用的时候就用这部分点插值得到其他所有的点。

解析 双线性插值

那要存储的这些点是怎么得来的呢,就好比你说的四个点,就是我们要存的网格点(一般通过对已知的坐标区域画网格的方法得到,落在网格四个角上的点就是我们要存的点,其他的点就不存了以后通过公式插出来,网格的大小自己顶,比如说原来的坐标点是12*12的矩阵,将这个矩阵均匀的画成4行4列,就行了了3*3的16个小网格),P点就是要在这四个点组成的长方形内,或者边上的点,

二、双线性插值法原理 python实现

码字不易,如果此文对你有所帮助,请帮忙点赞,感谢!

一.双线性插值法原理:

    ①何为线性插值?

解析 双线性插值

    插值就是在两个数之间插入一个数,线性插值原理图如下:

    ②各种插值法:

    插值法的第一步都是相同的,计算目标图(dstImage)的坐标点对应原图(srcImage)中哪个坐标点来填充,计算公式为:

     srcX= dstX*(srcWidth/dstWidth)

     srcY= dstY*(srcHeight/dstHeight)

    (dstX,dstY)表示目标图像的某个坐标点,(srcX,srcY)表示与之对应的原图像的坐标点。srcWidth/dstWidth和 srcHeight/dstHeight分别表示宽和高的放缩比。

    那么问题来了,通过这个公式算出来的 srcX, scrY有可能是小数,但是原图像坐标点是不存在小数的,都是整数,得想办法把它转换成整数才行。

        不同插值法的区别就体现在 srcX, scrY是小数时,怎么将其变成整数去取原图像中的像素值。

        最近邻插值(Nearest-neighborInterpolation):看名字就很直白,四舍五入选取最接近的整数。这样的做**导致像素变化不连续,在目标图像中产生锯齿边缘。

        双线性插值(Bilinear Interpolation):双线性就是利用与坐标轴平行的两条直线去把小数坐标分解到相邻的四个整数坐标点。权重与距离成反比。

     双三次插值(Bicubic Interpolation):与双线性插值类似,只不过用了相邻的16个点。但是需要注意的是,前面两种方法能保证两个方向的坐标权重和为1,但是双三次插值不能保证这点,所以可能出现像素值越界的情况,需要截断。

    ③双线性插值算法原理

        假如我们想得到未知函数 f在点 P=(x, y)的值,假设我们已知函数 f在 Q11=(x1, y1)、Q12=(x1, y2), Q21=(x2, y1)以及 Q22=(x2, y2)四个点的值。最常见的情况,f就是一个像素点的像素值。首先在 x方向进行线性插值,然后再在 y方向上进行线性插值,最终得到双线性插值的结果。

  ④举例说明

二. python实现灰度图像双线性插值算法:

灰度图像双线性插值放大缩小

import numpy as np

import math

import cv2

def double_linear(input_signal, zoom_multiples):

  '''

  双线性插值

  :param input_signal:输入图像

  :param zoom_multiples:放大倍数

  :return:双线性插值后的图像

  '''

   input_signal_cp= np.copy(input_signal) #输入图像的副本

   input_row, input_col= input_signal_cp.shape#输入图像的尺寸(行、列)

  #输出图像的尺寸

   output_row= int(input_row* zoom_multiples)

   output_col= int(input_col* zoom_multiples)

   output_signal= np.zeros((output_row, output_col))#输出图片

   for i in range(output_row):

     for j in range(output_col):

      #输出图片中坐标(i,j)对应至输入图片中的最近的四个点点(x1,y1)(x2, y2),(x3, y3),(x4,y4)的均值

       temp_x= i/ output_row* input_row

       temp_y= j/ output_col* input_col

       x1= int(temp_x)

       y1= int(temp_y)

       x2= x1

       y2= y1+ 1

       x3= x1+ 1

       y3= y1

       x4= x1+ 1

       y4= y1+ 1

       u= temp_x- x1

       v= temp_y- y1

      #防止越界

       if x4>= input_row:

         x4= input_row- 1

         x2= x4

         x1= x4- 1

         x3= x4- 1

       if y4>= input_col:

         y4= input_col- 1

         y3= y4

         y1= y4- 1

         y2= y4- 1

      #插值

       output_signal[i, j]=(1-u)*(1-v)*int(input_signal_cp[x1, y1])+(1-u)*v*int(input_signal_cp[x2, y2])+ u*(1-v)*int(input_signal_cp[x3, y3])+ u*v*int(input_signal_cp[x4, y4])

   return output_signal

# Read image

img= cv2.imread("../paojie_g.jpg",0).astype(np.float)

out= double_linear(img,2).astype(np.uint8)

# Save result

cv2.imshow("result", out)

cv2.imwrite("out.jpg", out)

cv2.waitKey(0)

cv2.destroyAllWindows()

三.灰度图像双线性插值实验结果:

四.彩色图像双线性插值python实现

def BiLinear_interpolation(img,dstH,dstW):

   scrH,scrW,_=img.shape

   img=np.pad(img,((0,1),(0,1),(0,0)),'constant')

   retimg=np.zeros((dstH,dstW,3),dtype=np.uint8)

   for i in range(dstH-1):

     for j in range(dstW-1):

       scrx=(i+1)*(scrH/dstH)

       scry=(j+1)*(scrW/dstW)

       x=math.floor(scrx)

       y=math.floor(scry)

       u=scrx-x

       v=scry-y

       retimg[i,j]=(1-u)*(1-v)*img[x,y]+u*(1-v)*img[x+1,y]+(1-u)*v*img[x,y+1]+u*v*img[x+1,y+1]

   return retimg

im_path='../paojie.jpg'

image=np.array(Image.open(im_path))

image2=BiLinear_interpolation(image,image.shape[0]*2,image.shape[1]*2)

image2=Image.fromarray(image2.astype('uint8')).convert('RGB')

image2.save('3.png')

五.彩色图像双线性插值实验结果:

六.最近邻插值算法和双三次插值算法可参考:

        ①最近邻插值算法: https://www.cnblogs.com/wojianxin/p/12515061.html

        https://blog.csdn.net/Ibelievesunshine/article/details/104936006

    ②双三次插值算法: https://www.cnblogs.com/wojianxin/p/12516762.html

        https://blog.csdn.net/Ibelievesunshine/article/details/104942406

七.参考内容:

      https://www.cnblogs.com/wojianxin/p/12515061.html

        https://blog.csdn.net/Ibelievesunshine/article/details/104939936

三、双线性插值的示例

已知的红色数据点与待插值得到的绿色点

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

首先在x方向进行线性插值,得到R1和R2,然后在y方向进行线性插值,得到P.

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

其中红色点Q11,Q12,Q21,Q22为已知的4个像素点.

第一步:X方向的线性插值,插入蓝色第二步:做完X方向的插值后再做Y方向的

点R1和R2插值,由R1与R2计算P点.

Y方向上插入绿色点P.

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

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

f(x,y)=f(0,0)(1-x)(1-y)+f(0,1)(1-x)y+f(1,1)xy+f(1,0)x(1-y)在x与y方向上,z值成单调性特性的应用中,此种方法可以做外插运算,即可以求解Q1~Q4所构成的正方形以外的点的值。双线性插值的一个显然的三维空间延伸是三线性插值。三线性插值的方法可参看matlab中的interp3

四、什么是双线性插值法

双线性插值,又称为双线性内插。在数学上,双线性插值是有两个变量的插值函数的线性插值扩展,其核心思想是在两个方向分别进行一次线性插值。

假如我们想得到未知函数 f在点 P=(x, y)的值,假设我们已知函数 f在 Q11=(x1, y1)、Q12=(x1, y2), Q21=(x2, y1)以及 Q22=(x2, y2)四个点的值。首先在 x方向进行线性插值,然后在 y方向进行线性插值。

与这种插值方法名称不同的是,这种插值方法并不是线性的,而是是两个线性函数的乘积。

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

关于解析 双线性插值,双线性插值的示例的介绍到此结束,希望对大家有所帮助。