• python实现图像高斯金字塔


    import cv2
    import numpy as np
    import matplotlib.pyplot as plt
    
    # Grayscale
    def BGR2GRAY(img):
        # Grayscale
        gray = 0.2126 * img[..., 2] + 0.7152 * img[..., 1] + 0.0722 * img[..., 0]
        return gray
    
    # Bi-Linear interpolation
    def bl_interpolate(img, ax=1., ay=1.):
        if len(img.shape) > 2:
            H, W, C = img.shape
        else:
            H, W = img.shape
            C = 1
    
        aH = int(ay * H)
        aW = int(ax * W)
    
        # get position of resized image
        y = np.arange(aH).repeat(aW).reshape(aW, -1)
        x = np.tile(np.arange(aW), (aH, 1))
    
        # get position of original position
        y = (y / ay)
        x = (x / ax)
    
        ix = np.floor(x).astype(np.int)
        iy = np.floor(y).astype(np.int)
    
        ix = np.minimum(ix, W-2)
        iy = np.minimum(iy, H-2)
    
        # get distance 
        dx = x - ix
        dy = y - iy
    
        if C > 1:
            dx = np.repeat(np.expand_dims(dx, axis=-1), C, axis=-1)
            dy = np.repeat(np.expand_dims(dy, axis=-1), C, axis=-1)
    
        # interpolation
        out = (1-dx) * (1-dy) * img[iy, ix] + dx * (1 - dy) * img[iy, ix+1] + (1 - dx) * dy * img[iy+1, ix] + dx * dy * img[iy+1, ix+1]
    
        out = np.clip(out, 0, 255)
        out = out.astype(np.uint8)
    
        return out
    
    # make image pyramid
    def make_pyramid(gray):
        # first element
        pyramid = [gray]
        # each scale
        for i in range(1, 6):
            # define scale
            a = 2. ** i
    
            # down scale
            p = bl_interpolate(gray, ax=1./a, ay=1. / a)
    
            # add pyramid list
            pyramid.append(p)
            
        return pyramid
    
    # Read image
    img = cv2.imread("../bird.png").astype(np.float)
    
    gray = BGR2GRAY(img)
    
    # pyramid
    pyramid = make_pyramid(gray)
    
    for i in range(6):
        cv2.imwrite("out_{}.jpg".format(2**i), pyramid[i].astype(np.uint8))
        plt.subplot(2, 3, i+1)
        plt.title('1/' + str((i+1)**2) )
        plt.imshow(pyramid[i], cmap='gray')
        plt.axis('off')
        plt.xticks(color="None")
        plt.yticks(color="None")
    
    plt.show()
    

    原图
    高斯金字塔

  • 相关阅读:
    bzoj3211 花神游历各国
    bzoj1010
    day8
    day6&7
    bzoj1087
    noi同步赛day1
    bzoj1076
    day3&4&5
    bzoj1079 dp
    cholesky分解
  • 原文地址:https://www.cnblogs.com/wojianxin/p/12565234.html
Copyright © 2020-2023  润新知