进行图像增广(数据扩充)的15种功能总结和Python代码实现(二)

简介: 进行图像增广(数据扩充)的15种功能总结和Python代码实现

裁剪

要进行图像增广,通常会随机裁剪图像。换句话说,我们在随机区域上裁剪了一部分随机大小的图像。

640.gif

可以从尺寸的比例(高度,宽度)中选择裁剪图像的尺寸。如果未指定裁剪的比例最大大小,则默认情况下,我们将认为它是图像的大小。

class Crop(object):
   def __init__(self, min_size_ratio, max_size_ratio=(1, 1)):
       self.min_size_ratio = np.array(list(min_size_ratio))
       self.max_size_ratio = np.array(list(max_size_ratio))
   def __call__(self, X, Y):
       size = np.array(X.shape[:2])
       mini = self.min_size_ratio * size
       maxi = self.max_size_ratio * size
       # random size
       h = np.random.randint(mini[0], maxi[0])
       w = np.random.randint(mini[1], maxi[1])
       # random place
       shift_h = np.random.randint(0, size[0] - h)
       shift_w = np.random.randint(0, size[1] - w)
       X = X[shift_h:shift_h+h, shift_w:shift_w+w]
       Y = Y[shift_h:shift_h+h, shift_w:shift_w+w]
       return X, Y

过滤器

一般情况

我们将开始一些有趣的事情。过滤器是很棒的方法,但我认为能够轻松创建我们自己的卷积过滤器非常重要。

所以我想做一个通用的函数,以便能够使用我们自己的过滤器。

class CustomFilter(object):
   def __init__(self, kernel):
       self.kernel = kernel
   def __call__(self, X, Y):
       X = cv2.filter2D(X, -1, self.kernel)
       return X, Y

锐化

就过滤器而言,可以通过选择上游过滤器并以随机权重应用过滤器来进行进一步处理。例如,我向您介绍用于锐化图像的过滤器。

640.png

中心值从0到65。

class Sharpen(object):
   def __init__(self, max_center=4):
       self.identity = np.array([[0, 0, 0],
                                [0, 1, 0],
                                [0, 0, 0]])
       self.sharpen = np.array([[ 0, -1,  0],
                              [-1,  4, -1],
                              [ 0, -1,  0]]) / 4
   def __call__(self, X, Y):
       sharp = self.sharpen * np.random.random() * self.max_center
       kernel = self.identity + sharp
       X = cv2.filter2D(X, -1, kernel)
       return X, Y

模糊

可以用最流行的滤镜来随机模糊我们的图像。有很多方法可以模糊我们的图像。最著名的是平均值,中值,高斯或双边滤波器。

平均模糊

640.gif

内核大小从1到35

关于平均滤波器。顾名思义,它使我们可以对给定中心的值取平均值。这是由内核完成的。可以指定其大小以增加或减少模糊。要使用平均滤波器增广图像,我们只需要使用随机大小的内核对输入图像进行滤波。

class GaussianBlur(object):
   def __init__(self, max_kernel=(7, 7)):
       self.max_kernel = ((max_kernel + 1) // 2)
   def __call__(self, X, Y):
       kernel_size = (
           np.random.randint(1, self.max_kernel[0]) * 2 + 1,
           np.random.randint(1, self.max_kernel[1]) * 2 + 1,
      )
       X = cv2.GaussianBlur(X, kernel_size, 0)
       return X, Y

高斯模糊

640.gif

内核大小从1到35

高斯模糊不使用平均滤波器,而是使用高斯滤波器,因此这些值对应于从中心开始的高斯曲线。请注意,内核维数只能包含奇数。

class GaussianBlur(object):
   def __init__(self, max_kernel=(7, 7)):
       self.max_kernel = max_kernel
   def __call__(self, X, Y):
       kernel_size = (
           np.random.randint(1, self.max_kernel[0] + 1),
           np.random.randint(1, self.max_kernel[1] + 1),
      )
       X = cv2.GaussianBlur(X, kernel_size, 0)
       return X, Y

透视变换

迄今为止,最广泛使用的图像增广技术是透视变换。有旋转平移剪切缩放。这些转换可以在3D维度中执行。通常,它们仅在2D中使用。让我们利用我们拥有的一切。

翻转

640.gif

平移

640.gif

剪切

640.gif

缩放

640.gif

结合

我不会在2D图像的3D转换上花费更多的时间,因为我写了有关这方面的整篇文章。因此,我选择了本文结尾处提供的函数。

应该注意的是,该函数允许我们根据所提出的4个矩阵随机执行变换。顺序很重要。这里我们有剪切,然后是旋转,然后是比例缩放,最后是平移。注意,平移是通过图像尺寸的比例完成的。

640.gif

结合随机旋转平移剪切和比例缩放

class Perspective(object):
   def __init__(self,
                max_ratio_translation=(0.2, 0.2, 0),
                max_rotation=(10, 10, 360),
                max_scale=(0.1, 0.1, 0.2),
                max_shearing=(15, 15, 5)):
       self.max_ratio_translation = np.array(max_ratio_translation)
       self.max_rotation = np.array(max_rotation)
       self.max_scale = np.array(max_scale)
       self.max_shearing = np.array(max_shearing)
   def __call__(self, X, Y):
       # get the height and the width of the image
       h, w = X.shape[:2]
       max_translation = self.max_ratio_translation * np.array([w, h, 1])
       # get the values on each axis
       t_x, t_y, t_z = np.random.uniform(-1, 1, 3) * max_translation
       r_x, r_y, r_z = np.random.uniform(-1, 1, 3) * self.max_rotation
       sc_x, sc_y, sc_z = np.random.uniform(-1, 1, 3) * self.max_scale + 1
       sh_x, sh_y, sh_z = np.random.uniform(-1, 1, 3) * self.max_shearing
       # convert degree angles to rad
       theta_rx = np.deg2rad(r_x)
       theta_ry = np.deg2rad(r_y)
       theta_rz = np.deg2rad(r_z)
       theta_shx = np.deg2rad(sh_x)
       theta_shy = np.deg2rad(sh_y)
       theta_shz = np.deg2rad(sh_z)
       # compute its diagonal
       diag = (h ** 2 + w ** 2) ** 0.5
       # compute the focal length
       f = diag
       if np.sin(theta_rz) != 0:
           f /= 2 * np.sin(theta_rz)
       # set the image from cartesian to projective dimension
       H_M = np.array([[1, 0, -w / 2],
                      [0, 1, -h / 2],
                      [0, 0,      1],
                      [0, 0,      1]])
       # set the image projective to carrtesian dimension
       Hp_M = np.array([[f, 0, w / 2, 0],
                        [0, f, h / 2, 0],
                        [0, 0,     1, 0]])
       # adjust the translation on z
       t_z = (f - t_z) / sc_z ** 2
       # translation matrix to translate the image
       T_M = np.array([[1, 0, 0, t_x],
                      [0, 1, 0, t_y],
                      [0, 0, 1, t_z],
                      [0, 0, 0,  1]])
       # calculate cos and sin of angles
       sin_rx, cos_rx = np.sin(theta_rx), np.cos(theta_rx)
       sin_ry, cos_ry = np.sin(theta_ry), np.cos(theta_ry)
       sin_rz, cos_rz = np.sin(theta_rz), np.cos(theta_rz)
       # get the rotation matrix on x axis
       R_Mx = np.array([[1,      0,       0, 0],
                        [0, cos_rx, -sin_rx, 0],
                        [0, sin_rx,  cos_rx, 0],
                        [0,      0,       0, 1]])
       # get the rotation matrix on y axis
       R_My = np.array([[cos_ry, 0, -sin_ry, 0],
                        [     0, 1,       0, 0],
                        [sin_ry, 0,  cos_ry, 0],
                        [     0, 0,       0, 1]])
       # get the rotation matrix on z axis
       R_Mz = np.array([[cos_rz, -sin_rz, 0, 0],
                        [sin_rz,  cos_rz, 0, 0],
                        [     0,       0, 1, 0],
                        [     0,       0, 0, 1]])
       # compute the full rotation matrix
       R_M = np.dot(np.dot(R_Mx, R_My), R_Mz)
       # get the scaling matrix
       Sc_M = np.array([[sc_x,     0,    0, 0],
                        [   0,  sc_y,    0, 0],
                        [   0,     0, sc_z, 0],
                        [   0,     0,    0, 1]])
       # get the tan of angles
       tan_shx = np.tan(theta_shx)
       tan_shy = np.tan(theta_shy)
       tan_shz = np.tan(theta_shz)
       # get the shearing matrix on x axis
       Sh_Mx = np.array([[      1, 0, 0, 0],
                        [tan_shy, 1, 0, 0],
                        [tan_shz, 0, 1, 0],
                        [      0, 0, 0, 1]])
       # get the shearing matrix on y axis
       Sh_My = np.array([[1, tan_shx, 0, 0],
                        [0,       1, 0, 0],
                        [0, tan_shz, 1, 0],
                        [0,       0, 0, 1]])
       # get the shearing matrix on z axis
       Sh_Mz = np.array([[1, 0, tan_shx, 0],
                        [0, 1, tan_shy, 0],
                        [0, 0,       1, 0],
                        [0, 0,       0, 1]])
       # compute the full shearing matrix
       Sh_M = np.dot(np.dot(Sh_Mx, Sh_My), Sh_Mz)
       Identity = np.array([[1, 0, 0, 0],
                            [0, 1, 0, 0],
                            [0, 0, 1, 0],
                            [0, 0, 0, 1]])
       # compute the full transform matrix
       M = Identity
       M = np.dot(Sh_M, M)
       M = np.dot(R_M,  M)
       M = np.dot(Sc_M, M)
       M = np.dot(T_M,  M)
       M = np.dot(Hp_M, np.dot(M, H_M))
       # apply the transformation
       X = cv2.warpPerspective(X, M, (w, h))
       Y = cv2.warpPerspective(Y, M, (w, h))
       return X, Y
目录
相关文章
|
3天前
|
数据采集 Web App开发 数据挖掘
使用Python和BeautifulSoup轻松抓取表格数据
使用Python和BeautifulSoup,结合代理IP,可以从网页抓取表格数据,如中国气象局的天气信息。通过requests库发送HTTP请求,BeautifulSoup解析HTML提取表格。安装必要库后,设置代理IP,发送请求,解析HTML找到表格,提取数据并存储。通过Pandas进行数据分析,如计算平均气温。这种方法让数据抓取和分析变得更加便捷。
使用Python和BeautifulSoup轻松抓取表格数据
|
3天前
|
数据安全/隐私保护 Python
Python装饰器是高阶函数,用于在不修改代码的情况下扩展或修改函数行为。它们提供可重用性、模块化和无侵入性的功能增强。
【6月更文挑战第20天】Python装饰器是高阶函数,用于在不修改代码的情况下扩展或修改函数行为。它们提供可重用性、模块化和无侵入性的功能增强。例如,`@simple_decorator` 包装`my_function`,在调用前后添加额外操作。装饰器还能接受参数,如`@logged("INFO", "msg")`,允许动态定制功能。
11 6
|
1天前
|
人工智能 数据挖掘 大数据
538个代码示例!麻省理工教授的Python程序设计+人工智能案例实践
Python简单易学,且提供了丰富的第三方库,可以用较少的代码完成较多的工作,使开发者能够专注于如何解决问题而只花较少的时间去考虑如何编程。 此外,Python还具有免费开源、跨平台、面向对象、胶水语言等优点,在系统编程、图形界面开发、科学计算、Web开发、数据分析、人工智能等方面有广泛应用。 尤其是在数据分析和人工智能方面,Python已成为最受开发者欢迎的编程语言之一,不仅大量计算机专业人员选择使用Python进行快速开发,许多非计算机专业人员也纷纷选择Python语言来解决专业问题。 由于Python应用广泛,关于Python的参考书目前已经有很多,但将Python编程与数据分析、人工智
|
3天前
|
SQL Oracle 关系型数据库
Python连接数据库进行数据查询的操作代码
mysql数据库(mariadb) 连接数据库 首先,你需要使用MySQLdb.connect()函数建立与MySQL数据库的连接。你需要提供数据库服务器的地址(host),用户名(user),密码(passwd),以及你想要操作的数据库名称(db)。 创建Cursor对象 一旦建立了数据库连接,你可以使用连接对象的cursor()方法来创建一个cursor对象。这个方法返回一个cursor实例,你可以使用这个实例来执行SQL查询和命令。
|
1天前
|
JSON API 数据库
Python使用Quart作为web服务器的代码实现
Quart 是一个异步的 Web 框架,它使用 ASGI 接口(Asynchronous Server Gateway Interface)而不是传统的 WSGI(Web Server Gateway Interface)。这使得 Quart 特别适合用于构建需要处理大量并发连接的高性能 Web 应用程序。与 Flask 类似,Quart 也非常灵活,可以轻松地构建 RESTful API、WebSockets、HTTP/2 服务器推送等。
|
2天前
|
缓存 数据库连接 开发者
Python中有哪些容易被忽视的核心功能
Python编程中,一些被忽视的核心功能包括:`argparse`库用于命令行参数解析,简化工具编写;使用`with`语句配合上下文管理器确保资源正确释放;列表推导式和生成器表达式创建列表和轻量级迭代;字典的`setdefault()`方法避免键不存在时的额外检查;默认参数值简化函数调用;`namedtuple`增加元组可读性;集合操作符执行并集、交集和差集;`lru_cache`缓存函数调用提高性能;`enumerate()`在迭代列表时同时访问索引和值;以及`Counter`统计元素频率。掌握这些功能可提升代码质量和效率。
|
2天前
|
JavaScript Python
Python if 的高级功能有哪些?
**Python 条件语句简介** `if` 用于检查变量是否为真,真值包括非零数、非空字符串、非空列表等。`if xxx:` 当 `xxx` 为真时执行代码块,否则跳过。`if xxx == xxx` 使用 `==` 比较值是否相等,`if xxx is xxx` 则检查是否为同一对象。
|
Python
使用python实现一个文件搜索功能,类似于Everything功能
一般人日常总是会将一些片段信息记录到文件中,放到电脑硬盘上。等过段时间,可能就不知道放到哪里了,电脑上文件夹太多。 找文件一般都会借助于搜索软件,比如Everything软件就很强大,输入名称,就能全局查找文件;
415 0
|
Linux Python
【Python】300行代码实现crontab定时器功能 【上】
熟悉Linux的都知道在Linux下有一个crontab的定时任务,可以很方便的进行各种定时、计划任务的执行。有时候写代码也需要用到定时器业务,因此我使用Python实现了一个类似的定时器模块,可以很方便的做定时业务,使用例子如下:
393 0
【Python】300行代码实现crontab定时器功能 【上】
一行Python可以实现的功能
手头有 109 张头部 CT 的断层扫描图片,我打算用这些图片尝试头部的三维重建。基础工作之一,就是要把这些图片数据读出来,组织成一个三维的数据结构(实际上是四维的,因为每个像素有 RGBA 四个通道)。