图像处理之图像上下采样

参考:
https://blog.csdn.net/stf1065716904/article/details/78450997
https://blog.csdn.net/qq_25737169/article/details/79192211

在做图像的神经网络训练之前,通常需要将图像上采样(图像放大、图像插值处理)或者下采样(图像缩略图)使图像符合显示区域大小,从而使原图像能显示在不同分辨率的显示设备上。对原图像的缩放操作不可避免会给图像带来影响,但也有些插值可增加图像信息,使缩放后的图像质量超过原图像。

下采样原理:对于一幅图像A尺寸为MN,对其进行k倍下采样,即得到(M/k)(N/k)尺寸的分辨率图像.如果考虑的是矩阵形式的图像,就是把原始图像k*k窗口内的图像变成一个像素,这个像素点的值就是窗口内所有像素的均值.

上采样原理:图像放大几乎都是采用内插值方法,即在原有图像像素的基础上在像素点之间采用合适的插值算法插入新的元素。


常用的插值方法                                                                                                                                                        

1、最邻近元法

  这是最简单的一种插值方法,不需要计算,在待求象素的四邻象素中,将距离待求象素最近的邻象素灰度赋给待求象素。设i+u, j+v(i, j为正整数, u, v为大于零小于1的小数,下同)为待求象素坐标,则待求象素灰度的值 f(i+u, j+v) 如下图所示:

 

 

如果(i+u, j+v)落在A区,即u<0.5, v<0.5,则将左上角象素的灰度值赋给待求象素,同理,落在B区则赋予右上角的象素灰度值,落在C区则赋予左下角象素的灰度值,落在D区则赋予右下角象素的灰度值。

最邻近元法计算量较小,但可能会造成插值生成的图像灰度上的不连续,在灰度变化的地方可能出现明显的锯齿状。

 

2、双线性内插法

双线性内插法是利用待求象素四个邻象素的灰度在两个方向上作线性内插,如下图所示:

 

 

对于 (i, j+v),f(i, j) 到 f(i, j+1) 的灰度变化为线性关系,则有:

      f(i, j+v) = [f(i, j+1) - f(i, j)] * v + f(i, j)

同理对于 (i+1, j+v) 则有:

                  f(i+1, j+v) = [f(i+1, j+1) - f(i+1, j)] * v + f(i+1, j)

从f(i, j+v) 到 f(i+1, j+v) 的灰度变化也为线性关系,由此可推导出待求象素灰度的计算式如下:

                  f(i+u, j+v) = (1-u) * (1-v) * f(i, j) + (1-u) * v * f(i, j+1) + u * (1-v) * f(i+1, j) + u * v * f(i+1, j+1)

双线性内插法的计算比最邻近点法复杂,计算量较大,但没有灰度不连续的缺点,结果基本令人满意。它具有低通滤波性质,使高频分量受损,图像轮廓可能会有一点模糊。

 

3、三次内插法

该方法利用三次多项式S(x)求逼近理论上最佳插值函数sin(x)/x, 其数学表达式为:

待求像素(x, y)的灰度值由其周围16个灰度值加权内插得到,如下图:

 

 

待求像素的灰度计算式如下:

 

f(x, y) = f(i+u, j+v) = ABC

 

其中: 

 

三次曲线插值方法计算量较大,但插值后的图像效果最好。


def img_scale(x, scale):
    weight = x.get_shape()[1].value
    height = x.get_shape()[2].value

    try:
        out = tf.image.resize_nearest_neighbor(x, size=(weight*scale, height*scale))
    except:
        out = tf.image.resize_images(x, size=[weight*scale, height*scale])
    return out

你可能感兴趣的:(图像处理之图像上下采样)