Text-render合成文字图像·拆解

指定合成数量,使用进程池生成 

合成步骤,整体为三步 

_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、均匀变换 

@datactass class UniformPerspectiveTransformCfg(PerspectiveTransformCfg) : x, y, z are uniform def get _ xyz( self) distributed -> Tuple[ftoat, x = np. random. uniform( y = np. random. uniform( z = np. random. uniform( return -self -self -self float, float] : self self .z) self

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) 

对合并后的文本图像进行调整 

对传入图像进行透视变换,返回图像和变换后的坐标框信息 

  1. get_rotate_matrix(x, y, z): 这个函数用于生成旋转矩阵,输入参数x、y、z为绕X轴、Y轴和Z轴的旋转角度(单位为度)。它返回一个3D旋转矩阵。 

  2. 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、边长和变换后的坐标点。 

这段代码主要的实现思路是通过旋转矩阵和投影矩阵来实现三维透视变换。具体的步骤包括: 

  1. 计算透视变换所需的参数,包括缩放比例、视野角度等。 

  2. 生成旋转矩阵,根据输入的旋转角度生成X、Y、Z轴的旋转矩阵。 

  3. 根据输入的图像宽高和透视变换参数,生成透视变换矩阵M33、变换后的边长和变换后的坐标点。 

  4. 对输入的图像进行透视变换,得到变换后的图像以及变换后的坐标点。 

  5. 根据变换后的坐标点对变换后的图像进行裁剪,去除多余的边缘部分。 

进行图像增强 

增强方案如上,挨个看下? 

官方示例 

Name 

方法 

Example 

bg_and_text_mask 

合成结果与文字图像 

char_spacing_compact 

字符间距紧凑 

char_spacing_large 

字符间距大 

color_image 

RGB图像 

curve 

曲线 

dropout_horizontal 

水平删除直线区域文字图像内容 

dropout_rand 

随机删除部分像素 

dropout_vertical 

垂直删除直线内容 

emboss 

浮雕 

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) 

裁剪背景图像后,将文字图像放到背景图像之上 

由于文字图像是透明的,则不会遮挡背景图像内容 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梅干菜扣肉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值