yolo:letterbox(padding)

本文介绍了如何使用OpenCV的copyMakeBorder函数进行图像边界填充,通过实例展示了如何在保持原始比例的同时,为图片添加灰色边框。通过`letterbox`函数,你可以调整图片尺寸并确保内容不失真。
摘要由CSDN通过智能技术生成

opencv API:

cv2.copyMakeBorder

示例代码:

import cv2

def letterbox(img,height=608,width=1088,
              color=(127.5,127.5,127.5)):
    shape=img.shape[:2]  # shape=[height,width]
    ratio=min(float(height)/shape[0],float(width)/shape[1])
    newShape=(round(shape[1]*ratio),round(shape[0]*ratio)) #newShape=[width,height]
    dw=(width-newShape[0])/2 # width padding
    dh=(height-newShape[1])/2 #height padding
    top,bottom=round(dh-0.1),round(dh+0.1)
    left,right=round(dw-0.1),round(dw+0.1)
    img=cv2.resize(img,newShape,interpolation=cv2.INTER_AREA) # resized no border
    img=cv2.copyMakeBorder(img,top,bottom,left,right,cv2.BORDER_CONSTANT,value=color)

    return img,ratio,dw,dh

if __name__=='__main__':
    imgDir='/home/.../images/anni.jpg'
    img=cv2.imread(imgDir)
    cv2.imshow('raw',img)
    imgRes,ratio,dw,dh=letterbox(img)
    cv2.imshow("test",imgRes)
    cv2.waitKey(0)


 原图:

 效果图(红色标示的灰色区域):

YOLO的输入预处理中,使用letterbox方法可以将图像缩放到指定大小并保持原始比例,同时在边缘填充灰色像素以保持图像的纵横比。下面是基于YUV图像实现YOLO letterbox预处理的步骤: 1. 读取YUV图像数据并解码,得到YUV三个通道的图像数据。 2. 将YUV三个通道的图像数据缩放到指定大小,保持原始图像的纵横比不变。 3. 计算缩放后图像在Letterbox中的位置和大小,并在边缘填充灰色像素。 4. 将填充后的图像转换为RGB格式,为了符合YOLO的输入格式,还需要将像素值归一化到0-1之间。 5. 将处理后的图像送入YOLO模型进行检测。 下面是一个基于Python语言的示例代码,实现了基于YUV图像的YOLO letterbox预处理: ```python import cv2 import numpy as np def yuv2rgb(yuv): yuv = yuv.astype(np.float32) y = yuv[..., 0] u = yuv[..., 1] v = yuv[..., 2] r = y + 1.13983 * v g = y - 0.39465 * u - 0.58060 * v b = y + 2.03211 * u rgb = np.stack([r, g, b], axis=-1) rgb = np.clip(rgb, 0, 255).astype(np.uint8) return rgb def letterbox_resize_yuv(yuv, size): h, w, _ = yuv.shape ratio = min(size[0] / h, size[1] / w) new_h = int(h * ratio) new_w = int(w * ratio) resized_yuv = cv2.resize(yuv, (new_w, new_h)) pad_h = (size[0] - new_h) // 2 pad_w = (size[1] - new_w) // 2 padded_yuv = cv2.copyMakeBorder(resized_yuv, pad_h, size[0]-new_h-pad_h, pad_w, size[1]-new_w-pad_w, cv2.BORDER_CONSTANT, value=(128, 128, 128)) rgb = yuv2rgb(padded_yuv) rgb = rgb.astype(np.float32) / 255.0 return rgb # 读取YUV图像数据 yuv = cv2.imread("example.yuv", cv2.IMREAD_UNCHANGED) # 进行YOLO letterbox预处理 input_size = (416, 416) yolo_input = letterbox_resize_yuv(yuv, input_size) # 将处理后的图像送入YOLO模型进行检测 results = model.predict(np.expand_dims(yolo_input, axis=0)) ``` 在上面的代码中,`yuv2rgb`函数实现了将YUV图像转换为RGB图像的功能,`letterbox_resize_yuv`函数实现了YOLO letterbox预处理的功能。其中,`input_size`指定了模型输入的大小,`yuv`是原始YUV图像数据。经过预处理后,得到的`yolo_input`即为符合YOLO模型输入要求的图像数据,可以直接送入模型进行检测。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值