opencv图片缩放
图片缩放原理
图片缩放是深度学习中常用的图片处理手段,有的图片原始尺寸非常大,放入模型训练容易导致显存爆炸,因此会对原始的图片进行缩放。本章节分别使用opencv的内置接口和自定义接口分别对图片进行缩放。
opencv自带的图片缩放接口
- 读取原始图片
import cv2
# 读取原始图片
img = cv2.imread("foo-001.jpeg")
cv2.imshow("img", img)
cv2.waitKey(0)
- 调用opencv的接口对原始图片做缩放
import cv2
# 读取原始图片
img = cv2.imread("foo-001.jpeg")
# 将图片resize到(224*224)的大小
img_size = cv2.resize(img, (224, 224))
cv2.imshow("resize", img_size )
cv2.waitKey(0)
opencv的缩放操作使得图片里的熊的比例发生变化,这种失真变化可能会导致模型训练效果不好,为此我们需要在缩放图片的同时保持图片内容的比例。
自定义缩放接口
import cv2
def img_resize(img, target_size=(224, 224)):
# 获取原始图像大小
old_size = img.shape[0:2]
# 计算原始图像宽高与目标图像大小的比例,并取其中的较小值
ratio = min(float(target_size[i]) / (old_size[i]) for i in range(len(old_size)))
# 根据上边求得的比例计算在保持比例前提下得到的图像大小
new_size = tuple([int(i * ratio) for i in old_size])
# 根据上边的大小进行放缩
img = cv2.resize(img, (new_size[1], new_size[0]))
# 计算需要填充的像素数目(图像的宽这一维度上)
pad_w = target_size[1] - new_size[1]
# 计算需要填充的像素数目(图像的高这一维度上)
pad_h = target_size[0] - new_size[0]
top, bottom = pad_h // 2, pad_h - (pad_h // 2)
left, right = pad_w // 2, pad_w - (pad_w // 2)
img_new = cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_CONSTANT, None, (0, 0, 0))
return img_new
img = cv2.imread("foo-001.jpeg")
img_new = img_resize(img, (224, 224))
cv2.imshow("img_new ", img_new )
cv2.waitKey(0)
图片的上下边缘填充了黑边,使得图片内容比例保持不变
结尾
欢迎一起学习、讨论技术!
B站账号:Silver__Wolf_
Q:130856474