一、letter_box
深度学习模型输入图片的尺寸为正方形,而数据集中的图片一般为长方形,粗暴的resize会使得图片失真,采用letterbox可以较好的解决这个问题。该方法可以保持图片的长宽比例,剩下的部分采用灰色填充。
二、代码
本例中,模型输入尺寸为604x640,而我们读取的图片的实际尺寸为128x384,通过letter_box操作,实现将原始图像以不失真的方式调整为640x640。
cpp
import cv2
import numpy as np
def letter_box_cv(image, target_size):
cv2.imshow('image', image)
cv2.waitKey()
dst_w, dst_h = target_size
scale = min(dst_h / image.shape[0], dst_w / image.shape[1]) # [0]=height [1]=width
ox = (-scale * image.shape[1] + dst_w + scale - 1) * 0.5
oy = (-scale * image.shape[0] + dst_h + scale - 1) * 0.5
M = np.array([[scale, 0, ox], [0, scale, oy]], dtype=np.float32)
IM = cv2.invertAffineTransform(M)
image_out = cv2.warpAffine(image, M, (dst_w, dst_h), flags=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT,
borderValue=(114, 114, 114))
cv2.imshow('image_out', image_out)
cv2.waitKey()
return image_out, M, IM
orgin_image = cv2.imread('demo.jpg')
target_size = [640, 640]
letter_box_cv(orgin_image, target_size)
运行结果