深度學習之資料增強一(opencv影象填充)
阿新 • • 發佈:2021-02-05
本文目的:將所有影象等比例縮放到小於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_WRAP:用另一邊的畫素進行填充
而value=[ , , ]的三個值在0~255之間,分別過紅綠藍(RGB)。
eg:[0,225,0]則填充綠色。