1. 程式人生 > 其它 >深度學習之資料增強一(opencv影象填充)

深度學習之資料增強一(opencv影象填充)

技術標籤:opecv學習pythonopencv深度學習

本文目的:將所有影象等比例縮放到小於224x224x3,然後再對不足224x224x3部分填充黑邊,達到所有圖片都是224x224x3的規格。
本人才疏學淺,也不知道如何準確論證為何填充黑邊是有效的行為,反正,親測效果十分明顯。

import cv2
f = open("img_path.txt")    #讀取存放影象檔案的文字檔案
i = 1
for name in f:
    name = name.split("\n")[0]   #根據自己txt檔案格式來讀取影象路徑
    img = cv2.imread(name)     #opencv讀取圖片
    heigth,width = img.shape[0],img.shape[1]   #獲取圖片的長和寬
    n = 1
    while True:
    	#等比例縮小圖片
        new_heigth = heigth/n 
        new_width = width/n
        #如果小於224x224,那麼進行填充以及儲存處理
        if (new_heigth <=224) and (new_width <=224):
            image = cv2.resize(img, (int(new_heigth), int(new_width)))
            a = int((224 - new_width) / 2)
            b = int((224 - new_heigth) / 2)
            #進行黑邊填充,關於該語句的詳細解讀看附錄
            image = cv2.copyMakeBorder(image, a, a, b, b, cv2.BORDER_CONSTANT, value=[0, 0, 0]) 
            cv2.imwrite("saved_image_file\\"+str(i)+".jpg", image)
            #列印儲存成功
            print("save {}.jpg successful !".format(i))
            i += 1
            break
            #處理長寬不統一的情況
        elif (new_heigth <=224) and (new_width > 224):
            n += 1
            new_width = width / n
        elif (new_heigth > 224) and (new_width <= 224):
            n += 1
            new_heigth = heigth/n
        n += 1

其實只是一些python語句和opencv的語句在運用而已,並無多少難度,但是有一句有必要詳細說明。

image = cv2.copyMakeBorder(image, a, a, b, b, cv2.BORDER_CONSTANT, value=[0, 0, 0]) 

首先cv2.copyMakeBorder(),看到這個名字也能盲猜是填充邊界。
而引數有以下這些
在這裡插入圖片描述
其中borderType則是圖片填充方式:有如下幾種
cv2.BORDER_CONSTANT:填充邊界時使用常數填充
cv2.BORDER_REPLICATE:使用邊界最接近的畫素填充,也就是用邊緣畫素填充
cv2.BORDER_REFLECT:反射法,是指對影象的畫素兩邊進行復制

cv2.BORDER_REFLECT101:反射法,把邊緣的畫素作為軸,對稱的複製
cv2.BORDER_WRAP:用另一邊的畫素進行填充


而value=[ , , ]的三個值在0~255之間,分別過紅綠藍(RGB)。
eg:[0,225,0]則填充綠色。