上采样:
在卷积神经网络中,由于输入图像通过卷积神经网络(CNN)提取特征后,输出的尺寸往往会变小
而有时我们需要将图像恢复到原来的尺寸以便进行进一步的计算(如图像的语义分割),这个使图像由小分辨率映射到大分辨率的操作,叫做上采样。
上采样的几种方法:
插值:
一、最近邻插值(Nearest Neighbor Interpolation)
对于未知位置,直接采用与它最邻近的像素点的值为其赋值
原图中(0,0)在放大后对应(0,0)
原图中(1,1)在放大后对应(4,4)
二、双线性插值(Bilinear Interpolation)
双线性插值就是做两次线性变换,先在X轴上做一次线性变换,求出每一行的R点:
再通过一次线性变换求出在该区域中的P点:
可以把上式汇成所要计算的f(x,y)
三、双三次插值(Bicubic Interpolation)
图中点(x,y)=(i+u,j+v)的值通过矩形网格中该点邻近的16个点加权平均得到。
假设源图像A大小为m*n,缩放K倍后的目标图像B的大小为M*N,即K=M/m。
A的每一个像素点是已知的,B是未知的,我们想要求出目标图像B中每一像素点(X,Y)的值,必须先找出像素(X,Y)在源图像A中对应的像素(x,y),再根据源图像A距离像素(x,y)最近的16个像素点作为计算目标图像B(X,Y)处像素值的参数,利用BiCubic基函数求出16个像素点的权重,图B像素(x,y)的值就等于16个像素点的加权叠加。
根据比例关系x/X=m/M=1/K,我们可以得到B(X,Y)在A上的对应坐标为A(x,y)=A(X*(m/M),Y*(n/N))=A(X/K,Y/K)。
如图所示P点就是目标图像B在(X,Y)处对应于源图像A中的位置,P的坐标位置会出现小数部分,
所以我们假设 P的坐标为P(x+u,y+v),其中x,y分别表示整数部分,u,v分别表示小数部分(蓝点到a11方格中红点的距离)。
那么我们就可以得到如图所示的最近16个像素的位置,在这里用a(i,j)(i,j=0,1,2,3)来表示,如上图。
我们要做的就是求出BiCubic函数中的参数x,从而获得上面所说的16个像素所对应的权重W(x)。
BiCubic基函数是一维的,而像素是二维的,所以我们将像素点的行与列分开计算。
BiCubic函数中的参数x表示该像素点到P点的距离:
例如a00距离P(x+u,y+v)的距离为(1+u,1+v),因此a00的横坐标权重i_0=W(1+u),纵坐标权重j_0=W(1+v),a00对B(X,Y)的贡献值为:(a00像素值)* i_0* j_0。
因此,a0X的横坐标权重分别为W(1+u),W(u),W(1-u),W(2-u);ay0的纵坐标权重分别为W(1+v),W(v),W(1-v),W(2-v);
B(X,Y)像素值为:
其实在插值计算时还可以使用矩阵表示,如下:
其中f(i+u,j+v)即为要计算的值,而A、C分别表示权重也就是第一种方式中的w_x,w_y,B为原图中16个邻近点构成的矩阵,计算权重的函数使用S(x)去近似。
源代码:
import torch from torchvision import transforms from PIL import Image from torchvision.utils import save_image img=Image.open('./Jay.png',mode='r') img_to_tensor=transforms.ToTensor()(img) # print(img_to_tensor.shape) nearest_neighbor_interpolation=transforms.Resize(size=(1024,1024), interpolation=transforms.InterpolationMode.NEAREST) nearest_resize_img=nearest_neighbor_interpolation(img_to_tensor) bilinear_interpolation=transforms.Resize(size=(1024,10248), interpolation=transforms.InterpolationMode.BILINEAR) bilinear_resize_img=bilinear_interpolation(img_to_tensor) # bicubic_interpolation=transforms.Resize(size=(1024,1024), interpolation=transforms.InterpolationMode.BICUBIC) bicubic_resize_img=bicubic_interpolation(img_to_tensor) save_image(nearest_resize_img,'./nearest.png') save_image(bilinear_resize_img,'./bilinear.png') save_image(bicubic_resize_img,'./bicubic.png')
标签:采样,方式,img,像素,transforms,图像,几种,像素点,interpolation From: https://www.cnblogs.com/WANGYIFEI124/p/17705862.html