1. 程式人生 > 其它 >baselines演算法庫common/tile_images.py模組分析

baselines演算法庫common/tile_images.py模組分析

該模組只有一個函式,全部內容:

import numpy as np

def tile_images(img_nhwc):
    """
    Tile N images into one big PxQ image
    (P,Q) are chosen to be as close as possible, and if N
    is square, then P=Q.

    input: img_nhwc, list or array of images, ndim=4 once turned into array
        n = batch index, h = height, w = width, c = channel
    returns:
        bigim_HWc, ndarray with ndim=3
    
""" img_nhwc = np.asarray(img_nhwc) N, h, w, c = img_nhwc.shape H = int(np.ceil(np.sqrt(N))) W = int(np.ceil(float(N)/H)) img_nhwc = np.array(list(img_nhwc) + [img_nhwc[0]*0 for _ in range(N, H*W)]) img_HWhwc = img_nhwc.reshape(H, W, h, w, c) img_HhWwc = img_HWhwc.transpose(0, 2, 1, 3, 4) img_Hh_Ww_c
= img_HhWwc.reshape(H*h, W*w, c) return img_Hh_Ww_c

 

輸入的是一個batch的圖片資料,維度為n*h*w*c  ,  n為batch_size,  h為圖片高度,  w為圖片寬度, c為圖片通道數。

這個模組,或者說這個函式的作用將n個圖片拼接成一個大圖片,大圖片的高為H個圖片的高h堆砌成,畫素為H*h,

大圖片的寬為W個圖片的高w堆砌成,畫素為W*w。

 

這時候有一個注意的問題那就是輸入的圖片個數,即batch_size可能不是可以開平方的數,如果batch_size可以開平方,那麼H=W=sqrt(n),

如果n不能開平方,那麼H則向下約近sqrt(n)的取整,W則向下約近n/H的取整。

即使是這樣設定H、W也不能避免H*W不等於n,這時就需要對拼接圖片進行補零操作:

    img_nhwc = np.array(list(img_nhwc) + [img_nhwc[0]*0 for _ in range(N, H*W)])

也就是說如果H*W小於n則用0補齊以保證一共拼接的圖片個數為H*W個,因為前面對H、W計算時使用的是向下約近,因此H*W不存在大於n的情況。

 

 

 

 

==============================================