图像金字塔, 高斯金字塔, 拉普拉斯金字塔

图像金字塔

一张图像以金字塔的形式分辨率一层一层的降低,最底层是图像的原图,*说白了,就是将图片,整个长和宽缩小一般,图片大小变成原来的四分之一
在这里插入图片描述

高斯金字塔

https://blog.csdn.net/poem_qianmo/article/details/26157633?tdsourcetag=s_pctim_aiomsg

用于图片下采用(减小图片的尺寸),从金字塔的底层到上层

拉普拉斯金子塔

https://blog.csdn.net/poem_qianmo/article/details/26157633?tdsourcetag=s_pctim_aiomsg

用于图片的上采样(扩大图片的尺寸),从金字塔的顶层到底层,需要配合高斯金字塔一起使用

拉普拉斯金字塔是通过源图像减去先缩小后再放大的图像的一系列图像构成的
在这里插入图片描述
高斯金字塔加上拉普拉斯金子塔就,几乎等于原来图像

21个项目玩转深度学习,P79

  • 制造高斯卷积核
k = np.float32([1, 4, 6, 4, 1])
k = np.outer(k, k)
k5x5 = k[:, :, None, None] / k.sum() * np.eye(3, dtype=np.float32)

输出k:在这里插入图片描述

# 这个函数将图像分为低频和高频成分
def lap_split(img):
    with tf.name_scope('split'):
        # 做过一次卷积相当于一次“平滑”,因此lo为低频成分,下采样
        lo = tf.nn.conv2d(img, k5x5, [1, 2, 2, 1], 'SAME')
        # 低频成分放缩到原始图像一样大小得到lo2,再用原始图像img减去lo2,就得到高频成分hi,上采样
        lo2 = tf.nn.conv2d_transpose(lo, k5x5 * 4, tf.shape(img), [1, 2, 2, 1])
        hi = img - lo2
    return lo, hi

# 这个函数将图像img分成n层拉普拉斯金字塔
def lap_split_n(img, n):
    levels = []
    for i in range(n):
        # 调用lap_split将图像分为低频和高频部分
        # 高频部分保存到levels中
        # 低频部分再继续分解
        img, hi = lap_split(img)
        levels.append(hi)
    # 添加低频部分
    levels.append(img)
    # 倒叙列表
    return levels[::-1]

# 将拉普拉斯金字塔还原到原始图像
def lap_merge(levels):
    img = levels[0]
    for hi in levels[1:]:
        with tf.name_scope('merge'):
            img = tf.nn.conv2d_transpose(img, k5x5 * 4, tf.shape(hi), [1, 2, 2, 1]) + hi
    return img


# 对img做标准化。
def normalize_std(img, eps=1e-10):
    with tf.name_scope('normalize'):
        std = tf.sqrt(tf.reduce_mean(tf.square(img)))
        return img / tf.maximum(std, eps)

# 拉普拉斯金字塔标准化
def lap_normalize(img, scale_n=4):
    img = tf.expand_dims(img, 0)
    tlevels = lap_split_n(img, scale_n)
    # 每一层都做一次normalize_std,标准化
    tlevels = list(map(normalize_std, tlevels))
    out = lap_merge(tlevels)
    return out[0, :, :, :]

猜你喜欢

转载自blog.csdn.net/qq_39124762/article/details/82945155