如何将任意大小的图片填充成一个方形

这种方式我认为是最适合的图片预处理方式,随意resize会改变图片的特征,而进行填充的方式除了会改变原来标签的坐标以外,可以完全保留图片上所有的物体最原始的特征。

def pad_to_square(img, pad_value):
    c, h, w = img.shape
    dim_diff = np.abs(h - w)
    # (upper / left) padding and (lower / right) padding
    pad1, pad2 = dim_diff // 2, dim_diff - dim_diff // 2
    # Determine padding
    pad = (0, 0, pad1, pad2) if h <= w else (pad1, pad2, 0, 0)
    # Add padding
    img = F.pad(img, pad, "constant", value=pad_value)

    return img, pad
  • img表示任意的一张图片,但是是已经打开的数组模式,要不然没有shape。0表示我们填充的元素,即黑色
  • 计算图片宽高之间的差值dim_diff
  • 计算两边填充的像素长度(这里的两边即指左右,也指上下,长度也填充多少行或列的0元素)
  • 如果该图片宽大于高,即它是一个扁的,这个时候应该填充的上下,所以位置在2,3处,反之在0,1处,这个位置是下面F.pad的参数要求
  • F.pad的参数要求中img表示要进行填充的数组,当pad为4个长度的元组时,其四个位置分别表示左填充,右填充,上填充,下填充,'constant’只需要知道有这么个参数就可以了,value表示填充的数字。
  • 最后返回填充后的图像数组,和pad的格式(pad的格式可以用来对原图上的位置标签进行修正)
            x1 = w_factor * (boxes[:, 1] - boxes[:, 3] / 2)
            y1 = h_factor * (boxes[:, 2] - boxes[:, 4] / 2)
            x2 = w_factor * (boxes[:, 1] + boxes[:, 3] / 2)
            y2 = h_factor * (boxes[:, 2] + boxes[:, 4] / 2)

其中boxes中存放的是该图片中物体所在中心左右(xyhw)归一化以后的相对坐标,先转化为左上右下的坐标以后乘上原图的宽高,就得到了在原图上目标所在位置的左上右下真实坐标。

            x1 += pad[0]
            y1 += pad[2]
            x2 += pad[1]
            y2 += pad[3]

其实这里的代码我个人感觉是有一点小问题的,比如:
0的位置表示左填充,如果在图片的左边填充,那么所有的横坐标都应该加上0位置,既然有01,则必然无23,所以纵坐标不变,但是x2加的却是1位置,其实我们想一下既然有左填充,那必然有右填充,而左填充和右填充的数值基本相同,所以此时x2加1位置(右填充长度),不够准确但影响不大。

2的位置表示上填充,即所有目标坐标的纵坐标加上2位置,既然有23,则必然无01,所以横坐标不变。

所以最后得到的左上右下坐标就是填充以后的原始坐标

            boxes[:, 1] = ((x1 + x2) / 2) / padded_w
            boxes[:, 2] = ((y1 + y2) / 2) / padded_h
            boxes[:, 3] *= w_factor / padded_w
            boxes[:, 4] *= h_factor / padded_h

最后又计算回到相对坐标。其中padded_w=padded_h,表示填充后的图片的宽高。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值