使用opencv對圖像進行crop,resize,pad

使用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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章