为了满足深度学习训练时的数据批处理,需要将所有图片缩放到相同的大小。直接缩放会导致纵横比改变,裁剪会丢失信息。比较合理的做法是按相同的比例缩放宽高,缺失的部分用固定值填充。具体步骤如下:首先用目标大小初始化一个窗帘,数值都是相同的数。将原图的长边缩放到目标尺寸,计算缩放比例,短边按照这个比例缩放,这样得到的图片就不会变形。缩放后的图片必须小于或等于目标尺寸,所以必须粘贴在屏幕中央,然后屏幕未覆盖的区域会自动变为空白,省去填充步骤。最后的幕布是最终想要的画面。ProgramimportnumpyasnpfromPILimportImagedefresize(img,size):#先创建一个目标尺寸的屏幕,然后把缩放后的图片贴到中间,这样就省去了两边填空的麻烦。canvas=Image.new("RGB",size=size,color="#7777")target_width,target_height=sizewidth,height=img.sizeoffset_x=0offset_y=0ifheight>width:#高度是长边height_=target_height#直接调整高度到目标尺寸scale=height_/height#计算高度调整了多少得到一个缩放比例width_=int(width*scale)#以相同比例缩放宽度offset_x=(target_width-width_)//2#计算一侧空白在x方向的距离else:#同上width_=target_widthscale=width_/widthheight_=int(height*scale)offset_y=(target_height-height_)//2img=img.resize((width_,height_),Image.BILINEAR)#缩放高度和宽度canvas.paste(img,box=(offset_x,offset_y))#将缩放后的图像粘贴到屏幕上#Thebox参数用于确定粘贴图片左上角的位置。offset_x是x轴一侧的空白,offset_y是y轴一侧的空白,这样图片就可以填充到屏幕中央returncanvasimg=Image.open('1.jpg')target__size=(500,300)#目标尺寸:宽为500,高为300res=resize(img,target__size)res.save('new.jpg')测试输入(1080x1440)输出(500x300)
