Функция заполнения изображения, реализованная Pillow

Python алгоритм компьютерное зрение
Функция заполнения изображения, реализованная Pillow

Pillow, а именно PIL, Python Imaging Library, по-китайски "подушка". Pillow — это стандартная библиотека для обработки изображений на платформе Python с очень мощными функциями и простым в использовании API.

В этой статье рассказывается о функции заполнения изображения, реализованной в Pillow.pad_image, для предварительной обработки наборов данных изображений. В алгоритме обнаружения цели входное изображение нужно преобразовать в изображение требуемого моделью размера, при этом сохраняя масштаб без изменений, а остальное залить серым цветом.

Конкретная реализация функции выглядит следующим образом:

  • Рассчитать ширину и высоту изображения после масштабирования и пропорционально уменьшить или увеличить его;
  • Вызовите resize(), чтобы изменить размер изображения;
  • Создать новое () изображение целевого размера target_size;
  • Вызовите текстуру paste(), чтобы поместить масштабированное исходное изображение в целевое изображение.

Реализация выглядит следующим образом:

def pad_image(image, target_size):
    iw, ih = image.size  # 原始图像的尺寸
    w, h = target_size  # 目标图像的尺寸
    scale = min(float(w) / float(iw), float(h) / float(ih))  # 转换的最小比例

    # 保证长或宽,至少一个符合目标图像的尺寸
    nw = int(iw * scale)
    nh = int(ih * scale)

    image = image.resize((nw, nh), Image.BICUBIC)  # 缩小图像
    # image.show()
    new_image = Image.new('RGB', target_size, (128, 128, 128))  # 生成灰色图像
    # // 为整数除法,计算图像的位置
    new_image.paste(image, ((w - nw) // 2, (h - nh) // 2))  # 将图像填充为中间图像,两侧为灰色的样式
    # new_image.show()

    return new_image

контрольная работа:

def main():
    img_path = 'xxxx.jpg'
    image = Image.open(img_path)
    size = (416, 416)
    pad_image(image, size)  # 填充图像

if __name__ == '__main__':
    main()

Исходное изображение:

Small

Исправлять:

Paste


Версия OpenCV

def preprocess_image(fn_img):
    img = cv2.imread(fn_img)
    h, w, _ = img.shape
    m = h if h > w else w
    r = m / 256
    h_ = int(h / r)
    w_ = int(w / r)
    img = cv2.resize(img, (w_, h_))

    offset_w = int((256 - w_) / 2)
    offset_h = int((256 - h_) / 2)
    img_bkg = np.ones((256, 256, 3)) * 255
    img_bkg = img_bkg.astype(int)
    img_bkg[offset_h:256 - offset_h, offset_w:256 - offset_w] = img

    return img_bkg

OK, that's all! Enjoy it!

Для получения дополнительных навыков работы с алгоритмами обратите внимание на паблик-аккаунт WeChat:глубокий алгоритм(ID: DeepAlgorithm)