上采样一些常见的方法有:近邻插值(nearest interpolation)、双线性插值(bilinear interpolation),双三次插值(Bicubic interpolation),反卷积(Transposed Convolution),反池化(Unpooling)。
近邻插值
最近邻插值法nearest_neighbor是最简单的灰度值插值。也称作零阶插值,就是令变换后像素的灰度值等于距它最近的输入像素的灰度值。最近邻插值法可应用于图像的缩放,因为简单的变换与计算,效果一般不好。举例说明其变换过程:
先假设一个2X2像素的图片采用最近邻插值法需要放大到4X4像素的图片,右边?该为多少。
最近邻插值法坐标变换计算公式:
srcX=dstX*(srcWidth/dstWidth)
srcY=dstY*(srcHeight/dstHeight)
上式中,dstX与dstY为目标图像的某个像素的横纵坐标,dstWidth与dstHeight为目标图像的长与宽;srcWidth与srcHeight为原图像的宽度与高度。srcX,srcY为目标图像在该点(dstX,dstY)对应的原图像的坐标。至于公式为啥是这个样,和容易理解,如果是放大图像,(srcWidth/dstWidth)值小于1,同样将dstX同比例映射到原图像的srcX中,如果srcWidth/dstWidth=1,就相当于复制了图片。
与opencv一样,以左上角为(0,0)坐标。
右图为经过放大后的目标图像,?处的坐标为(3,2),根据公式计算得到
srcX=3*(2/4)=1.5,srcY=2*(2/4)=1;故?处的像素应该为原图像中的(1.5,1)像素的值,但是像素坐标没有小数,一般采用四舍五入取最邻,所以最终的结果为(2,1),对应原图像的橙色。其他类比得到放大后的图像:
双线性插值法(bilinear interpolation)
双线性插值法也叫双线性内插,其核心思想是在两个方向分别进行一次线性插值。双线性插值作为数值分析中的一种插值算法,广泛应用在信号处理,数字图像和视频处理等方面。
如坐标图所示,用横纵坐标代表图像像素的位置,f(x,y)代表该像素点(x,y)的彩色值或灰度值。
将图像放大或缩小,目的像素dst对应的原像素src中的坐标转换公式如下,公式很好理解,可参考上一章最近邻插值法。
srcX=dstX*(srcWidth/dstWidth)
srcY=dstY*(srcHeight/dstHeight)
上式中,dstX与dstY为目标图像的某个像素的横纵坐标,dstWidth与dstHeight为目标图像的长与宽;srcWidth与srcHeight为原图像的宽度与高度。srcX,srcY为目标图像在该点(dstX,dstY)对应的原图像的坐标。
现在假设目标图像的像素点(x’,y’)映射到原图像中是(x,y),也就是图中的P点。设Q11 = (x1, y1)、Q12 = (x1, y2)、Q21 = (x2, y1) 、 Q22 = (x2, y2),图中Q11,Q12,Q21,Q22分别为距离P点的最近的四个点。分别在X方向进行两次插值,最后在y方向进行插值即可得到目标图像的像素值。公式如下:
先计算X方向(也可以先计算Y方向,再计算X方向)的线性插值:
再在y方向进行线性插值得到f§:
经过公式的进一步化简可以得到
由于是最近的点,所以Q的四个点的坐标之间相差1,故进一步化简为:
参考文献:
https://www.cnblogs.com/wancy/p/15212604.html
https://www.cnblogs.com/wancy/p/15068519.html
https://www.cnblogs.com/wanghui-garcia/p/11399053.html
https://zhuanlan.zhihu.com/p/337745762