Program - 图像调整长条图像为近似方形

在图像分类算法中,输入图像有些比例过大,在训练时resize图像会导致丢失信息,因此,将图像调整至近似于方形,可以降低这一部分损失。

例如长条图像:

test

调整后,比例更趋近于合理:

image-20210917114244548

函数逻辑如下:

  1. 判断宽高比例ratio,大于4或小于0.25,进行调整,阈值4正好是2的平方。
  2. 计算需要压缩的倍数,倍数是比例ratio的平方根取整
  3. 将图像水平或竖直,切分成多块,再合并图像,即是输出。

源码如下:

def resize_crop_square(img_arr):
    """
    将图像压缩至正方形
    """
    h, w, _ = img_arr.shape
    w_ratio = float(w) / float(h)
    if w_ratio > 4:  # 宽大于高
        x = int(np.sqrt(w_ratio))
        gap_w = w // x
        patch_list = []
        for i in range(x):
            path_img = img_arr[:, i * gap_w:(i + 1) * gap_w]
            patch_list.append(path_img)
        img_out = merge_imgs(patch_list, 1, x)
    elif w_ratio < 0.25:  # 高大于宽
        h_ratio = 1.0 / w_ratio
        x = int(np.sqrt(h_ratio))
        gap_h = h // x
        patch_list = []
        for i in range(x):
            path_img = img_arr[i * gap_h:(i + 1) * gap_h, :]
            patch_list.append(path_img)
        img_out = merge_imgs(patch_list, x, 1)
    else:
        img_out = img_arr
    return img_out

调用函数merge_imgs,将多个小图合并成一个大图,如下:

def merge_imgs(imgs, cols, rows, is_h=True):
    """
    多个小图合并成大图
    :param imgs: 图像序列
    :param cols: 行数
    :param rows: 列数
    :param is_h: 是否水平排列
    :return: 合并大图
    """
    import numpy as np

    if not imgs:
        raise Exception('[Exception] 合并图像的输入为空!')

    img_shape = imgs[0].shape
    h, w, c = img_shape

    large_imgs = np.ones((rows * h, cols * w, c)) * 255  # 大图
    large_imgs = large_imgs.astype(np.uint8)

    if is_h:
        for j in range(rows):
            for i in range(cols):
                idx = j * cols + i
                if idx > len(imgs) - 1:  # 少于帧数,忽略
                    break
                large_imgs[(j * h):(j * h + h), (i * w): (i * w + w)] = imgs[idx]
    else:
        for i in range(cols):
            for j in range(rows):
                idx = i * cols + j
                if idx > len(imgs) - 1:  # 少于帧数,忽略
                    break
                large_imgs[(j * h):(j * h + h), (i * w): (i * w + w)] = imgs[idx]

    return large_imgs
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ElminsterAumar

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值