算法简单来说就是一句话,让原图的高宽乘以同一个数,这样就不会改变比例,而这个数就是min( 高缩放的比例,宽缩放的比例),然后padding周围区域使得缩放到指定大小。
效果:
1. python实现
import cv2
import numpy as np
# 缩放
def letterbox_image(img, input_dim):
"""
resize image with unchanged aspect ratio using padding
让原图的高宽乘以同一个数,这样就不会改变比例,而这个数就是min( 高缩放的比例,宽缩放的比例),然后padding周围区域使得缩放到指定大小。
缩小: (2000, 4000) -> (200,200), min(200/4000, 200/2000) = 1/20, 2000 * 1/20 = 100, 4000 * 1/20 = 200
新的尺度(100, 200),再padding
放大: (50, 100) -> (200, 200), min(4, 2) = 2, 50 * 2 = 100, 100 * 2 = 200
新的尺度(100, 200),再padding
:param img: 原始图片
:param input_dim: (w, h). 缩放后的尺度
:return:
"""
orig_w, orig_h = img.shape[1], img.shape[0]
input_w, input_h = input_dim # 缩放(orig_w, orig_h) -> (input_w, input_h)
# 1,根据缩放前后的尺度,获取有效的新的尺度(new_w, new_h)
min_ratio = min(input_w / orig_w, input_h / orig_h)
new_w &