算法-图像调整长条图像为近似方形
Posted SpikeKing
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法-图像调整长条图像为近似方形相关的知识,希望对你有一定的参考价值。
在图像分类算法中,输入图像有些比例过大,在训练时resize图像会导致丢失信息,因此,将图像调整至近似于方形,可以降低这一部分损失。
例如长条图像:
调整后,比例更趋近于合理:
函数逻辑如下:
- 判断宽高比例ratio,大于4或小于0.25,进行调整,阈值4正好是2的平方。
- 计算需要压缩的倍数,倍数是比例ratio的平方根取整。
- 将图像水平或竖直,切分成多块,再合并图像,即是输出。
源码如下:
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
以上是关于算法-图像调整长条图像为近似方形的主要内容,如果未能解决你的问题,请参考以下文章