使用opencv-python 對圖像進行resize和填充
在圖像輸入神經網絡之前,需要進行一定的處理,假設神經網絡的圖像輸入是256 256然後進行了224 224的random crop。
我們需要進行如下處理:
- 讀入原始圖像
image = cv2.imread("img.jpg")
- 截取圖像中有價值的部分
region = image[y1:y2, x1:x2]
- 確定圖片的長邊和短邊,然後把長邊resize到224,保持縱橫比的情況下resize短邊
w, h = x2 - x1, y2 - y1 # h, w = image.shape
m = max(w, h)
ratio = 224.0 / m
new_w, new_h = int(ratio * w), int(ratio *h)
assert new_w > 0 and new_h > 0
resized = cv2.resize(region, (new_w, new_h))
- 把圖片進行填充,填充到256 256
W, H = 256, 256
top = (H - new_h) // 2
bottom = (H - new_h) // 2
if top + bottom + h < H:
bottom += 1
left = (W - new_w) // 2
right = (W - new_w) // 2
if left + right + w < W:
right += 1
pad_image = cv2.copyMakeBorder(resized, top, bottom, left, right, cv2.BORDER_CONSTANT, value = self.white)
- 圖片在輸入網絡之後,訓練的時候進行random crop,就會發生有一部分被截取掉的情況,而這正是我們想要的圖像增強
- 在test階段,是進行centre crop,而正好把整個圖像都截取出來,而這正是我們想要的
值得注意的是,image.shape,cv2.resize和cv2.copyMakeBorder幾個函數
image.shape的輸出是(H, W, C)
cv2.resize的第二個參數dim是(W, H)
cv2.copyMakeBorder的第二個到第五個參數是top, bottom, left, right,是先H後W
opencv中以左上角爲原點,W方向爲x,H方向爲y