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

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