指定合成数量,使用进程池生成
合成步骤,整体为三步
_should_apply_layout
可选单语料合成与多语料合成
render_effects
进行图像增强
return_bg_and_mask
添加背景与mask
分别拆解:
1、语料选项
多语料合成
bg = self.bg_manager.get_bg()
获取背景图像,返回PIL格式RGBA图像
注意:在读取图像后将图像转换为RGBA,添加透明通道
text_color = self.cfg.text_color_cfg.get_color(bg)
获取文字颜色,从背景图像中获取文字颜色
该方法有两种实现:
1、直接返回255,50,0,255的颜色
2、对背景图像取均值,透明通道从110-255区间中随机选择,rgb三色从0-0.7*均值 中随机选择
text_mask = draw_text_on_bg(
font_text, _text_color, char_spacing=self.corpus[i].cfg.char_spacing
)
遍历文字,将文字写入到背景图像上,传入文字类,颜色,自定义字符间距(默认为-1)
便利文字类中的所有字符,获取每个字符的大小宽高,使用ImageFont提供的get_size()可以获取到给定字符在给定字体字号中文字的大小
如果是横排,宽为文字总宽,高为文字最大高度,竖排相反:宽为最大宽,高为总高
添加随机字符空格,控制每个字符之间的间距
text_mask = transparent_img((width, height))
draw = ImageDraw.Draw(text_mask)
创建一张指定宽高的RGBA图像
将文字按照字符间距绘制到创建的图像上,非横排图像文字旋转90度为竖排文字,最后返回该图像
text_bbox = BBox.from_size(text_mask.size)
使用图像宽高创建一个BBox对象,从【宽,高】中计算得到左上、右下两点坐标,位置空间
将每个文字图像与文字位置记录
text_mask_bboxes, merged_text = self.layout(
font_texts,
[it.copy() for it in text_bboxes],
[BBox.from_size(it.size) for it in text_masks],
)
进行布局操作,将每个字符图像合并,放置
父类方法
主要实现,随机间距排列多个文字位置
merged_bbox = BBox.from_bboxes(text_mask_bboxes)
合并多个文字坐标框为一个总的坐标框
新创建一个合并后大小的图像,按照每个字符的左侧边界放置到新创建的图像上
进行图像增强,增强方法有3个类可选择
基类
1、固定透视变换
2、均匀变换
3、正态分布变换
具体来说,该方法接受两个参数:mu 和 sigma3。mu 表示均值,默认值为 0;sigma3 表示标准差的倍数,默认值为 1(对应 99% 范围)。
首先,根据 sigma3 的值计算实际的标准差 sigma,通过将 sigma3 除以 3 来实现。这是因为正态分布的 99% 区间范围大约是均值加减 3 倍标准差。
然后,使用 NumPy 库的 randn 函数生成一个服从标准正态分布的随机数,并乘以 sigma,再加上 mu,得到最终的随机数 dst。
接下来,通过 np.clip 函数将随机数 dst 限制在 -sigma3 到 sigma3 的范围内,即将超出该范围的值截断为边界值。这样可以确保生成的随机数不会超出预定的标准差范围。
最后,将限制后的随机数 dst 返回作为方法的结果。
(
transformed_text_mask,
transformed_text_pnts,
) = transformer.do_warp_perspective(merged_text_mask)
对合并后的文本图像进行调整
对传入图像进行透视变换,返回图像和变换后的坐标框信息
-
get_rotate_matrix(x, y, z): 这个函数用于生成旋转矩阵,输入参数x、y、z为绕X轴、Y轴和Z轴的旋转角度(单位为度)。它返回一个3D旋转矩阵。
-
PerspectiveTransform类: 透视变换类,用于执行透视变换操作。构造函数接收一个配置对象cfg作为参数,其中包含了X、Y、Z轴的旋转角度、缩放比例和视野角度等参数。
-
get_transformed_size(size)函数:根据输入的图像尺寸,计算经过透视变换后的图像尺寸。
-
do_warp_perspective(pil_img)函数:对输入的PIL图像进行透视变换,并返回变换后的图像和变换后的坐标点。
-
transform_pnts(pnts, M33)函数:应用透视变换矩阵M33,将输入的二维坐标点进行透视变换。
-
get_warped_pnts(ptsIn, ptsOut, W, H, sidelength)函数:根据输入的原始和目标坐标点、图像宽高和变换后的边长,生成透视变换的坐标点。
-
gen_warp_matrix(width, height)函数:根据输入的图像宽高,生成透视变换矩阵M33、边长和变换后的坐标点。
这段代码主要的实现思路是通过旋转矩阵和投影矩阵来实现三维透视变换。具体的步骤包括:
-
计算透视变换所需的参数,包括缩放比例、视野角度等。
-
生成旋转矩阵,根据输入的旋转角度生成X、Y、Z轴的旋转矩阵。
-
根据输入的图像宽高和透视变换参数,生成透视变换矩阵M33、变换后的边长和变换后的坐标点。
-
对输入的图像进行透视变换,得到变换后的图像以及变换后的坐标点。
-
根据变换后的坐标点对变换后的图像进行裁剪,去除多余的边缘部分。
进行图像增强
增强方案如上,挨个看下?
官方示例
Name | 方法 | Example | |
0 | bg_and_text_mask | 合成结果与文字图像 | |
1 | char_spacing_compact | 字符间距紧凑 | |
2 | char_spacing_large | 字符间距大 | |
3 | color_image | RGB图像 | |
4 | curve | 曲线 | |
5 | dropout_horizontal | 水平删除直线区域文字图像内容 | |
6 | dropout_rand | 随机删除部分像素 | |
7 | dropout_vertical | 垂直删除直线内容 | |
8 | emboss | 浮雕 | |
9 | extra_text_line_layout | 额外的文本行布局 镜像? | |
10 | line_bottom | 底部线条 | |
11 | line_bottom_left | 底部、左侧线条 | |
12 | line_bottom_right | 底部、右侧线条 | |
13 | line_horizontal_middle | 文本中间水平线 | |
14 | line_left | 左侧线条 | |
15 | line_right | 右侧线条 | |
16 | line_top | 顶部线条 | |
17 | line_top_left | 顶部、左侧线条 | |
18 | line_top_right | 顶部、右侧线条 | |
19 | line_vertical_middle | 文本中间垂直线 | |
20 | padding | 四周填充像素 | |
21 | perspective_transform | 透视变换 | |
22 | same_line_layout_different_font_size | 水平多字不同大小 | |
23 | vertical_text | 竖向排列 |
合并文字图像到背景图像中
按照文字图像的大小在背景图像中选取区域
如果背景图像小于文字图像,则resize背景图像到文本图像大小
bg.paste(transformed_text_mask, (0, 0), mask=transformed_text_mask)
裁剪背景图像后,将文字图像放到背景图像之上
由于文字图像是透明的,则不会遮挡背景图像内容