【Opencv】copyMakeBorder的用法

具体使用场景

在图像输入神经网络之前,需要进行一定的处理,假设神经网络的图像输入是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)

具体copyMakeBorder的参数讲解:

https://blog.csdn.net/qq_22764813/article/details/52787553

图片在输入网络之后,训练的时候进行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

 

参考

https://blog.csdn.net/qq_20622615/article/details/80929746

你可能感兴趣的:(Opencv)