具体使用场景
在图像输入神经网络之前,需要进行一定的处理,假设神经网络的图像输入是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的参数讲解:
图片在输入网络之后,训练的时候进行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