图像增强看起来像真正的示例python 对于多张图片

问题描述

我已经生成了很多像车牌一样的图像如下[![在此处输入图像描述] 现在,想要转换所有这样的图像,如 real world vehicle number plate 图像。 例如-

enter image description here

如何处理这些类型的 augmentation 并将所有增强图像保存在另一个文件夹中。

解决方法

解决方案

查看图书馆:albumentations。试着回答这个问题:“你拥有的图像和你想要的图像有什么区别?”。例如,该图像是:

  • 更加像素化,
  • 颗粒状,
  • 分辨率较低,
  • 也可能有钉子/紧固螺丝
  • 可能在主号码下方或上方写有其他内容
  • 上面可能有阴影
  • 车牌可能在某些地方亮度不均。

Albumentations,帮助您提出多种类型的图像增强。请尝试按照我的建议分解这个问题,然后尝试从相册中找出您需要哪些增强功能。

使用 albumentations 的图像增强示例

以下代码块 (source) 向您展示了如何应用影集进行图像增强。如果您有一个图像和一个蒙版,它们将经历相同的转换。

另一个来自 kaggle 的例子:Image Augmentation Demo with albumentation

from albumentations import (
    HorizontalFlip,IAAPerspective,ShiftScaleRotate,CLAHE,RandomRotate90,Transpose,Blur,OpticalDistortion,GridDistortion,HueSaturationValue,IAAAdditiveGaussianNoise,GaussNoise,MotionBlur,MedianBlur,IAAPiecewiseAffine,IAASharpen,IAAEmboss,RandomBrightnessContrast,Flip,OneOf,Compose
)
import numpy as np

def strong_aug(p=0.5):
    return Compose([
        RandomRotate90(),Flip(),Transpose(),OneOf([
            IAAAdditiveGaussianNoise(),GaussNoise(),],p=0.2),OneOf([
            MotionBlur(p=0.2),MedianBlur(blur_limit=3,p=0.1),Blur(blur_limit=3,ShiftScaleRotate(shift_limit=0.0625,scale_limit=0.2,rotate_limit=45,OneOf([
            OpticalDistortion(p=0.3),GridDistortion(p=0.1),IAAPiecewiseAffine(p=0.3),OneOf([
            CLAHE(clip_limit=2),IAASharpen(),IAAEmboss(),RandomBrightnessContrast(),p=0.3),HueSaturationValue(p=0.3),p=p)

image = np.ones((300,300,3),dtype=np.uint8)
mask = np.ones((300,300),dtype=np.uint8)
whatever_data = "my name"
augmentation = strong_aug(p=0.9)
data = {"image": image,"mask": mask,"whatever_data": whatever_data,"additional": "hello"}
augmented = augmentation(**data)
image,mask,whatever_data,additional = augmented["image"],augmented["mask"],augmented["whatever_data"],augmented["additional"]

战略

  • 首先将增强的数量减少到最低限度
  • 保存单个增强图像
  • 在增强后保存一些图像。
  • 现在测试和更新您的增强管道,以满足您模拟真实场景的要求。
  • 完成您的管道并在大量图像上运行它。
  • 计时:多少张图片需要多长时间。
  • 然后最后在所有图像上运行它:这次您可以估计运行它需要多长时间。

注意:每次图像通过增强管道时,只有一个增强图像实例从中出来。因此,假设您想要每个图像的 10 个不同的增强版本,您需要将每个图像通过增强管道 10 次,然后才能继续下一个图像。

# this will not be what you end up using
# but you can begin to understand what 
# you need to do with it.

def simple_aug(p-0,5):
    return return Compose([
        RandomRotate90(),# Flip(),# Transpose(),])

# for a single image: check first
image = ... # write your code to read in your image here
augmentation = strong_aug(p=0.5)

augmented = augmentation({'image': image}) # see albumentations docs
# SAVE the image
# If you are using imageio or PIL,saving an image 
# is rather straight forward,and I will let you
# figure that out.
# save the content of the variable: augmented['image']

对于多张图片

假设每个图像通过增强管道 10 次,您的代码可能如下所示:

import os

# I assume you have a way of loading your 
# images from the filesystem,and they come 
# out of `images` (an iterator)

NUM_AUG_REPEAT = 10
AUG_SAVE_DIR = 'data/augmented'

# create directory of not present already
if not os.path.isdir(AUG_SAVE_DIR):
    os.makedirs(AUG_SAVE_DIR)

# This will create augmentation ids for the same image
# example: '00','01','02',...,'08','09' for
#          - NUM_AUG_REPEAT = 10
aug_id = lambda x: str(x).zfill(len(str(NUM_AUG_REPEAT)))

for image in images:
    for i in range(NUM_AUG_REPEAT):
        data = {'image': image}
        augmented = augmentation(**data)
        # I assume you have a function: save_image(image_path,image)
        # You need to write this function with 
        # whatever logic necessary. (Hint: use imageio or PIL.Image)
        image_filename = f'image_name_{aug_id(i)}.png'
        save_image(os.path.join(AUG_SAVE_DIR,image_filename),augmented['image'])

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...