深度学习中的图像尺寸变换:scalepadding方法详解
创作时间:
作者:
@小白创作中心
深度学习中的图像尺寸变换:scalepadding方法详解
引用
1
来源
1.
https://www.cnblogs.com/wancy/p/18538672
在深度学习中,图像尺寸的变换是一个常见的预处理步骤。传统的resize方法可能会导致图像失真,特别是当目标尺寸与原始图像的宽高比不一致时。为了解决这个问题,本文介绍了两种常用的scalepadding方法:先填充为正方形后缩放,以及先缩放再填充。这两种方法都能在保持图像比例的同时,将图像调整到目标尺寸。
先填充为正方形后缩放
- 确定长边和短边
- 首先,确定图像的长边和短边。长边是图像的宽度和高度中较长的那个,短边是较短的那个。
- 将图像变为正方形
- 以长边的长度作为正方形的边长,这意味着如果原始图像是长方形,那么它的一边将被扩展以形成一个正方形。
- 较短的一边将围绕其周围填充像素,通常是白色或黑色像素,以确保图像变为正方形。
- 填充像素
- 填充操作会在短边的两侧添加像素,直到图像的宽度和高度相等。填充的像素数量取决于原始图像的尺寸和目标正方形的尺寸。
- 缩放(如双线性插值,最近邻插值等)
- 一旦图像被转换为正方形,下一步是使用插值法将图像缩放到所需的目标尺寸。
- 双线性插值是一种平滑的缩放技术,它通过考虑周围四个像素的值来计算新像素的值,这样可以减少缩放过程中的失真。
示意图如下:
第一步:确定长边与短边,然后将原始图变为正方形,边长长度为长边长度,在短边的外侧填充,使得图变为宽为w,高为w的图。
第二步:缩放变换,将上一步中得到的宽为w,高为w的图经过缩放变换后就变为了宽为width,高为height的目标大小的图了。
原始图宽为w,高为h,以及填充的其中一个部分(w-h)/2变换为目标图像后,很容易得到缩放关系如下:
- w乘以(width/w)后,就变为了width,
- h乘以(height/w)后,就变为了(h*height)/w了,图中未标注出来(第二步中间图的紫色区域的高度),
- (w-h)/2乘以(height/w)后,就变为了((w-h)*height)/(2w)。
注意,如果目标的width与height不相等,也就是目标不为正方形就会造成w与h不是同等比例缩放,就会变形失真。所以这种方法只适用于width等于height的情况。
先缩放再填充(通用)
- 计算缩放比例
- 首先,根据目标尺寸和原始图像的宽高比,计算出图像在保持宽高比的情况下应该被缩放到的尺寸。这通常涉及到计算缩放比例,即目标尺寸与原始图像尺寸的比值,并选择较小的那个比例作为最终的缩放比例,以确保图像不会被拉伸或压缩。
- 进行resize操作
- 使用计算出的缩放比例对原始图像进行resize操作,得到一个新的图像。这个新图像的尺寸将小于或等于目标尺寸,但会保持原始图像的宽高比。
- 进行padding操作
- 最后,在新的图像的周围添加padding,以使其达到目标尺寸。padding可以使用任何颜色或图案,但通常选择中性色(如灰色或白色)以避免对图像内容造成干扰。padding的大小将根据目标尺寸和新图像尺寸之间的差异来确。
上图中实际上需要根据width/w与height/h两者的大小,决定ratio的值。为了防止在缩放过程中,某条边超过目标的长度,应该选择width/w与height/h的较小者作为ratio。看下面代码:
import cv2
import numpy as np
def resize_and_pad(image, target_height, target_width, padding_value=(0, 0, 0)):
# 获取原始图像的高度和宽度
height, width = image.shape[:2]
# 计算缩放比例,使得图像的长宽比例保持不变
scale = min(target_width / width, target_height / height)
# 计算缩放后的尺寸
new_width = int(width * scale)
new_height = int(height * scale)
# 先对图像进行缩放
resized_image = cv2.resize(image, (new_width, new_height))
# 创建一个目标大小的空白图像(填充背景为自定义颜色)
padded_image = np.full((target_height, target_width, 3), padding_value, dtype=np.uint8)
# 计算填充的上下左右边距
top_padding = (target_height - new_height) // 2
# bottom_padding = target_height - new_height - top_padding
left_padding = (target_width - new_width) // 2
# right_padding = target_width - new_width - left_padding
# 将缩放后的图像放置到填充后的图像中心
padded_image[top_padding:top_padding + new_height, left_padding:left_padding + new_width] = resized_image
return padded_image, resized_image, left_padding, top_padding
if __name__ == '__main__':
# 示例使用
image = cv2.imread('./img/lena2.png',1) # 读取图像 (528, 532, 3)
# image_resize=cv2.resize(image,None,fx=0.5,fy=0.5)
# cv2.imwrite("img/lena_02.png", image_resize)
print("image.shape",image.shape)#(400, 323, 3)
target_height = 300 # 目标高度
target_width = 400 # 目标宽度
padding_value = (114, 114, 114) # 自定义填充值(RGB)
padded_image, resized_image, left_padding, top_padding = resize_and_pad(image, target_height, target_width,padding_value)
print("padded_image.shape", padded_image.shape)
# 保存结果
cv2.imwrite('result.jpg', padded_image)
原图
目标图
如果将目标大小改为height=150,width=200,目标图比原图小,也是先缩放,再填充,如下:
小结:缩放填充是一种基本的操作,再图像预处理中,为了使得图片不因形变失真,往往采用这种方式,比如后面会介绍的YOLOV5的图片预处理的方法。
参考:
https://blog.csdn.net/weixin_51226647/article/details/139688302
热门推荐
房企风险化解要这样做
10万亿经营贷要到期了
抵押贷款到期后如何处理?过期抵押贷款的续期、转让和偿还全攻略
逾期借款无法协商怎么办?八大应对措施全解析
西葫芦炒肉末,家常美味轻松做
清炒西葫芦
过度物质追求致幸福失衡,专家呼吁重拾精神富足
央视推出《有礼走遍天下》:古礼新解助力现代社交
庄子、老子教你调节心态:古代智慧应对现代心理困境
太卷了吧!纽交所拟推22小时交易,港股、A股交易时间会不会也延长?
中药煎煮小窍门,让你秒变养生达人
古法煎中药,养生新潮流
肝病患者降脂用药指南:专家详解个性化选择与注意事项
房屋贷款评估流程有哪些关键环节?这些环节如何确保房屋贷款安全?
北京中医医院教你防胸痛
冬季流鼻血焦虑症的心理调节秘籍
冬季胸痛高发,家庭急救这样做!
急性冠脉综合征:胸痛背后的隐形杀手
小雪节气养生攻略:这些食材和汤水助你增强免疫力
冬季流鼻血频发?湖南省人民医院专家支招
冬季流鼻血急救,你做对了吗?
《凡人歌》:在生活困境中寻找希望的都市群像
在平凡中寻找不凡:普通人也能活出精彩人生
凡人赋:平凡生活中的五种智慧
2024年必看纯爱番:《更衣人偶坠入爱河》以真实情感打动人心
婴儿消炎用药指南:三种常用药物及使用禁忌
布洛芬、对乙酰氨基酚等五种儿童常用药使用禁忌
儿科抗生素使用指南:6种常用药物详解
新生儿感染防治指南:从风险到预防全解析
探秘“自然中国心”——鸡心岭的绝美秋景