Python等比例缩放图片
使用了 OpenCV 进行图片的读取
输入:利用 cv2.imread
函数读取的 Mat
矩阵
输出:缩放后的 Mat
矩阵(示例代码为缩放到 512x512 大小,也可自行设定大小)
待处理图片分为两种类型:宽 > 高(Width > Height) 或 宽 < 高(Width < Height)
若是 宽 > 高:
那么缩放后多余出来的宽度,从中间截取 512 个像素。
若是 宽 < 高:
那么缩放后宽度不够,两侧填充黑色补齐到宽为 512 个像素。
示例代码:
def imgToSize(img):
''' imgToSize()
# ----------------------------------------
# Function: 将图像等比例缩放到 512x512 大小
# 根据图像长宽不同分为两种缩放方式
# Param img: 图像 Mat
# Return img: 返回缩放后的图片
# Example: img = imgToSize(img)
# ----------------------------------------
'''
# 测试点
# cv2.imshow('metaImg.jpg', img)
imgHeight, imgWidth = img.shape[:2]
# cv.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
# src 原图像,dsize 输出图像的大小,
# img = cv2.resize(img, (512,512))
zoomHeight = 512
zoomWidth = int(imgWidth*512/imgHeight)
img = cv2.resize(img, (zoomWidth,zoomHeight))
# 测试点
# cv2.imshow('resizeImg', img)
# 如果图片属于 Width<Height,那么宽度将达不到 512
if imgWidth >= imgHeight:
# 正常截取图像
w1 = (zoomWidth-512)//2
# 图像坐标为先 Height,后 Width
img = img[0:512, w1:w1+512]
else:
# 如果宽度小于 512,那么对两侧边界填充为全黑色
# 根据图像的边界的像素值,向外扩充图片,每个方向扩充50个像素,常数填充:
# dst = cv2.copyMakeBorder(src, top, bottom, left, right, borderType[, dst[, value]])
# dst = cv2.copyMakeBorder(img,50,50,50,50, cv2.BORDER_CONSTANT,value=[0,255,0])
# 需要填充的宽度为 512-zoomWidth
left = (512-zoomWidth)//2
# 避免余数取不到
right = left+1
img = cv2.copyMakeBorder(img, 0,0,left,right, cv2.BORDER_CONSTANT, value=[0,0,0])
img = img[0:512, 0:512]
# 测试点
# cv2.imshow('size512', img)
return img