python實現影象高斯金字塔的示例程式碼
阿新 • • 發佈:2020-12-13
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) # 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,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()
以上就是python實現影象高斯金字塔的示例程式碼的詳細內容,更多關於python 影象高斯金字塔的資料請關注我們其它相關文章!