一個 Pillow 實現的圖像填充函數

Pillow,即PIL,Python Imaging Library,中文是「枕頭」。Pillow是Python平臺中圖像處理的標準庫,功能很是強大,API簡單易用。python

本文分享一個Pillow實現的圖像填充函數pad_image,用於預處理圖像數據集。在目標檢測算法中,須要把輸入圖像,轉換爲,模型所需尺寸的圖像,同時,保持比例不變,其他部分用灰色填充。算法

函數的具體實現,以下:微信

  • 計算圖像縮放以後的寬高,等比例縮小或擴大;
  • 調用resize(),改變圖像的尺寸;
  • 新建new()目標尺寸target_size的圖像;
  • 調用paste()貼圖,將縮放後的原始圖像,放入目標圖像中。

實現以下:函數

def pad_image(image, target_size):
    iw, ih = image.size  # 原始圖像的尺寸
    w, h = target_size  # 目標圖像的尺寸
    scale = min(float(w) / float(iw), float(h) / float(ih))  # 轉換的最小比例

    # 保證長或寬,至少一個符合目標圖像的尺寸
    nw = int(iw * scale)
    nh = int(ih * scale)

    image = image.resize((nw, nh), Image.BICUBIC)  # 縮小圖像
    # image.show()
    new_image = Image.new('RGB', target_size, (128, 128, 128))  # 生成灰色圖像
    # // 爲整數除法,計算圖像的位置
    new_image.paste(image, ((w - nw) // 2, (h - nh) // 2))  # 將圖像填充爲中間圖像,兩側爲灰色的樣式
    # new_image.show()

    return new_image
複製代碼

測試:測試

def main():
    img_path = 'xxxx.jpg'
    image = Image.open(img_path)
    size = (416, 416)
    pad_image(image, size)  # 填充圖像

if __name__ == '__main__':
    main()
複製代碼

原圖:spa

Small

修改:code

Paste


OpenCV版本

def preprocess_image(fn_img):
    img = cv2.imread(fn_img)
    h, w, _ = img.shape
    m = h if h > w else w
    r = m / 256
    h_ = int(h / r)
    w_ = int(w / r)
    img = cv2.resize(img, (w_, h_))

    offset_w = int((256 - w_) / 2)
    offset_h = int((256 - h_) / 2)
    img_bkg = np.ones((256, 256, 3)) * 255
    img_bkg = img_bkg.astype(int)
    img_bkg[offset_h:256 - offset_h, offset_w:256 - offset_w] = img

    return img_bkg
複製代碼

OK, that's all! Enjoy it!cdn

更多算法技巧,關注微信公衆號:深度算法(ID: DeepAlgorithm)blog

相關文章
相關標籤/搜索