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

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

剪下

640.gif

在整个输入上用0替换进行抠图并同时裁剪目标

抠图非常直观。它涉及随机删除输入图像的区域。它的工作方式与我们之前提到的裁剪相同。但是,我们不删除相关区域。因此,我们可以再次允许用户提供每个比例的要删除区域的最小和最大大小最大区域数,以同时或不同时从目标剪切区域,我们可以剪切每个通道,还选择已删除区域的默认替换值。

640.gif

输入剪切通道替换为1,不裁剪目标

class Cutout(object):
   def __init__(self,
                min_size_ratio,
                max_size_ratio,
                channel_wise=False,
                crop_target=True,
                max_crop=10,
                replacement=0):
       self.min_size_ratio = np.array(list(min_size_ratio))
       self.max_size_ratio = np.array(list(max_size_ratio))
       self.channel_wise = channel_wise
       self.crop_target = crop_target
       self.max_crop = max_crop
       self.replacement = replacement
   def __call__(self, X, Y):
       size = np.array(X.shape[:2])
       mini = self.min_size_ratio * size
       maxi = self.max_size_ratio * size
       for _ in range(self.max_crop):
           # 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)
           if self.channel_wise:
               c = np.random.randint(0, X.shape[-1])
               X[shift_h:shift_h+h, shift_w:shift_w+w, c] = self.replacement
               if self.crop_target:
                   Y[shift_h:shift_h+h, shift_w:shift_w+w] = self.replacement
           else:
               X[shift_h:shift_h+h, shift_w:shift_w+w] = self.replacement
               if self.crop_target:
                   Y[shift_h:shift_h+h, shift_w:shift_w+w] = self.replacement
       return X, Y

色彩空间

640.gif

现在,我们进入最有趣的部分。也是很少考虑的部分。如果我们知道色彩空间,则可以利用它们的属性来增广图像。举一个简单的例子,借助HSV颜色空间,我们可以很容易地提取树叶的颜色,并根据我们的意愿随机更改其颜色。那是一件很酷的事情!并且我们可以了解自己的图像增广功能的原理。当然,这需要更多的创造力。因此,重要的是要了解我们的色彩空间,以充分利用它们。特别是因为它们对于我们(深度)机器学习模型的预处理至关重要。

class Leaf(object):
   def __init__(self):
       pass
   def __call__(self, X, Y):
       blur = cv2.GaussianBlur(X, (7, 7), 0)
       hsv_blur = cv2.cvtColor(blur, cv2.COLOR_BGR2HSV)
       # lower mask (0-10)
       lower_red = np.array([0,130,130])
       upper_red = np.array([20,255,255])
       mask_0 = cv2.inRange(hsv_blur, lower_red, upper_red)
       # upper mask (170-180)
       lower_red = np.array([165,130,130])
       upper_red = np.array([185,255,255])
       mask_1 = cv2.inRange(hsv_blur, lower_red, upper_red)
       hsv_blur[np.where(mask_1)] = hsv_blur[np.where(mask_1)] - np.array([165, 0, 0])
       mask = mask_0 + mask_1
       # change color
       turn_color = np.random.randint(0, 255)
       hsv_blur[np.where(mask)] = hsv_blur[np.where(mask)] + np.array([turn_color, 0, 0])
       X_blur = cv2.cvtColor(hsv_blur, cv2.COLOR_HSV2BGR)
       X[np.where(mask)] = X_blur[np.where(mask)]
       return X, Y

亮度

640.gif

亮度从-100到100

图像增广的一个伟大经典就是能够改变亮度。有几种方法可以做到这一点,最简单的就是简单地添加一个随机偏差

class Brightness(object):
   def __init__(self, range_brightness=(-50, 50)):
       self.range_brightness = range_brightness
   def __call__(self, X, Y):
       brightness = np.random.randint(*self.range_brightness)
       X = X + brightness
       return X, Y

对比度

640.gif

对比度从-100到100

同样,使用对比非常简单。这也可以通过随机数完成。

class Contrast(object):
   def __init__(self, range_contrast=(-50, 50)):
       self.range_contrast = range_contrast
   def __call__(self, X, Y):
       contrast = np.random.randint(*self.range_contrast)
       X = X * (contrast / 127 + 1) - contrast
       return X, Y

噪声注入

最后一种相当常见的图像增广技术是噪声注入。实际上,我们只添加与输入大小相同的矩阵。该矩阵由遵循随机分布的元素组成。可以从任何随机分布中进行噪声注入。实际上,我们只看到其中两个。但是随时可以进一步😃

一般方法

640.gif

class UniformNoise(object):
   def __init__(self, low=-50, high=50):
       self.low = low
       self.high = high
   def __call__(self, X, Y):
       noise = np.random.uniform(self.low, self.high, X.shape)
       X = X + noise
       return X, Y

高斯方法

640.gif

class GaussianNoise(object):
   def __init__(self, center=0, std=50):
       self.center = center
       self.std = std
   def __call__(self, X, Y):
       noise = np.random.normal(self.center, self.std, X.shape)
       X = X + noise
       return X, Y

渐晕

640.gif

最后,更少使用但并非没有用的一种方法。有些相机会产生渐晕效果。考虑如何通过随机模仿这种现象来增广图像也很有趣。我们还将尝试为用户提供灵活性。我们将能够确定距离效果和可以随机开始的最小距离,确定其强度,甚至可以确定效果是朝着黑色还是向白色方向发展。

class Vignetting(object):
   def __init__(self,
                ratio_min_dist=0.2,
                range_vignette=(0.2, 0.8),
                random_sign=False):
       self.ratio_min_dist = ratio_min_dist
       self.range_vignette = np.array(range_vignette)
       self.random_sign = random_sign
   def __call__(self, X, Y):
       h, w = X.shape[:2]
       min_dist = np.array([h, w]) / 2 * np.random.random() * self.ratio_min_dist
       # create matrix of distance from the center on the two axis
       x, y = np.meshgrid(np.linspace(-w/2, w/2, w), np.linspace(-h/2, h/2, h))
       x, y = np.abs(x), np.abs(y)
       # create the vignette mask on the two axis
       x = (x - min_dist[0]) / (np.max(x) - min_dist[0])
       x = np.clip(x, 0, 1)
       y = (y - min_dist[1]) / (np.max(y) - min_dist[1])
       y = np.clip(y, 0, 1)
       # then get a random intensity of the vignette
       vignette = (x + y) / 2 * np.random.uniform(*self.range_vignette)
       vignette = np.tile(vignette[..., None], [1, 1, 3])
       sign = 2 * (np.random.random() < 0.5) * (self.random_sign) - 1
       X = X * (1 + sign * vignette)
       return X, Y

镜头变形

最后,这是一种非常好的方法。我很惊讶它不经常被使用。但是它可以模仿相机镜头的失真。就像透过圆形玻璃看。在我们看来,由于透镜(玻璃)是圆形的,因此失真了。因此,如果我们的图像是从带镜头的相机拍摄的,为什么不模拟它们。默认情况下,应将其用于图像。至少我是这样认为的。

640.gif

因此,我建议在最后一个函数中,通过播放径向系数k1,k2,k3和切向系数p1,p2,可以随机模拟我们的镜头失真。在该方法中,系数的顺序如下:k1,k2,p1,p2,k3。

class LensDistortion(object):
   def __init__(self, d_coef=(0.15, 0.15, 0.1, 0.1, 0.05)):
       self.d_coef = np.array(d_coef)
   def __call__(self, X, Y):
       # get the height and the width of the image
       h, w = X.shape[:2]
       # compute its diagonal
       f = (h ** 2 + w ** 2) ** 0.5
       # set the image projective to carrtesian dimension
       K = np.array([[f, 0, w / 2],
                    [0, f, h / 2],
                    [0, 0,     1]])
       d_coef = self.d_coef * np.random.random(5) # value
       d_coef = d_coef * (2 * (np.random.random(5) < 0.5) - 1) # sign
       # Generate new camera matrix from parameters
       M, _ = cv2.getOptimalNewCameraMatrix(K, d_coef, (w, h), 0)
       # Generate look-up tables for remapping the camera image
       remap = cv2.initUndistortRectifyMap(K, d_coef, None, M, (w, h), 5)
       # Remap the original image to a new image
       X = cv2.remap(X, *remap, cv2.INTER_LINEAR)
       Y = cv2.remap(Y, *remap, cv2.INTER_LINEAR)
       return X, Y

希望对您有用!请随时关注我或就您喜欢或不喜欢的内容给我反馈。✏️待会儿见!😘

目录
相关文章
|
1天前
|
算法 Serverless 数据处理
从集思录可转债数据探秘:Python与C++实现的移动平均算法应用
本文探讨了如何利用移动平均算法分析集思录提供的可转债数据,帮助投资者把握价格趋势。通过Python和C++两种编程语言实现简单移动平均(SMA),展示了数据处理的具体方法。Python代码借助`pandas`库轻松计算5日SMA,而C++代码则通过高效的数据处理展示了SMA的计算过程。集思录平台提供了详尽且及时的可转债数据,助力投资者结合算法与社区讨论,做出更明智的投资决策。掌握这些工具和技术,有助于在复杂多变的金融市场中挖掘更多价值。
22 12
|
4天前
|
人工智能 搜索推荐 测试技术
通义灵码 2.0 智能编码功能评测:Deepseek 加持下的 Python 开发体验
通义灵码 2.0 智能编码功能评测:Deepseek 加持下的 Python 开发体验
59 10
|
6天前
|
数据采集 数据安全/隐私保护 Python
从零开始:用Python爬取网站的汽车品牌和价格数据
在现代化办公室中,工程师小李和产品经理小张讨论如何获取懂车帝网站的汽车品牌和价格数据。小李提出使用Python编写爬虫,并通过亿牛云爬虫代理避免被封禁。代码实现包括设置代理、请求头、解析网页内容、多线程爬取等步骤,确保高效且稳定地抓取数据。小张表示理解并准备按照指导操作。
从零开始:用Python爬取网站的汽车品牌和价格数据
|
23天前
|
存储 缓存 Java
Python高性能编程:五种核心优化技术的原理与Python代码
Python在高性能应用场景中常因执行速度不及C、C++等编译型语言而受质疑,但通过合理利用标准库的优化特性,如`__slots__`机制、列表推导式、`@lru_cache`装饰器和生成器等,可以显著提升代码效率。本文详细介绍了这些实用的性能优化技术,帮助开发者在不牺牲代码质量的前提下提高程序性能。实验数据表明,这些优化方法能在内存使用和计算效率方面带来显著改进,适用于大规模数据处理、递归计算等场景。
58 5
Python高性能编程:五种核心优化技术的原理与Python代码
|
1月前
|
数据采集 Web App开发 数据可视化
Python用代理IP获取抖音电商达人主播数据
在当今数字化时代,电商直播成为重要的销售模式,抖音电商汇聚了众多达人主播。了解这些主播的数据对于品牌和商家至关重要。然而,直接从平台获取数据并非易事。本文介绍如何使用Python和代理IP高效抓取抖音电商达人主播的关键数据,包括主播昵称、ID、直播间链接、观看人数、点赞数和商品列表等。通过环境准备、代码实战及数据处理与可视化,最终实现定时任务自动化抓取,为企业决策提供有力支持。
|
1月前
|
安全 前端开发 数据库
Python 语言结合 Flask 框架来实现一个基础的代购商品管理、用户下单等功能的简易系统
这是一个使用 Python 和 Flask 框架实现的简易代购系统示例,涵盖商品管理、用户注册登录、订单创建及查看等功能。通过 SQLAlchemy 进行数据库操作,支持添加商品、展示详情、库存管理等。用户可注册登录并下单,系统会检查库存并记录订单。此代码仅为参考,实际应用需进一步完善,如增强安全性、集成支付接口、优化界面等。
|
2月前
|
Python
课程设计项目之基于Python实现围棋游戏代码
游戏进去默认为九路玩法,当然也可以选择十三路或是十九路玩法 使用pycharam打开项目,pip安装模块并引用,然后运行即可, 代码每行都有详细的注释,可以做课程设计或者毕业设计项目参考
78 33
|
文字识别 算法 前端开发
100行Python代码实现一款高精度免费OCR工具
近期Github开源了一款基于Python开发、名为Textshot的截图工具,刚开源不到半个月已经500+Star。
|
2月前
|
Python
[oeasy]python055_python编程_容易出现的问题_函数名的重新赋值_print_int
本文介绍了Python编程中容易出现的问题,特别是函数名、类名和模块名的重新赋值。通过具体示例展示了将内建函数(如`print`、`int`、`max`)或模块名(如`os`)重新赋值为其他类型后,会导致原有功能失效。例如,将`print`赋值为整数后,无法再用其输出内容;将`int`赋值为整数后,无法再进行类型转换。重新赋值后,这些名称失去了原有的功能,可能导致程序错误。总结指出,已有的函数名、类名和模块名不适合覆盖赋新值,否则会失去原有功能。如果需要使用类似的变量名,建议采用其他命名方式以避免冲突。
52 14
|
2月前
|
分布式计算 大数据 数据处理
技术评测:MaxCompute MaxFrame——阿里云自研分布式计算框架的Python编程接口
随着大数据和人工智能技术的发展,数据处理的需求日益增长。阿里云推出的MaxCompute MaxFrame(简称“MaxFrame”)是一个专为Python开发者设计的分布式计算框架,它不仅支持Python编程接口,还能直接利用MaxCompute的云原生大数据计算资源和服务。本文将通过一系列最佳实践测评,探讨MaxFrame在分布式Pandas处理以及大语言模型数据处理场景中的表现,并分析其在实际工作中的应用潜力。
116 2

热门文章

最新文章

推荐镜像

更多