@@ -46,6 +46,7 @@ def generate(
4646 character_spacing ,
4747 margins ,
4848 fit ,
49+ output_mask ,
4950 ):
5051 image = None
5152
@@ -61,7 +62,7 @@ def generate(
6162 raise ValueError ("Vertical handwritten text is unavailable" )
6263 image = handwritten_text_generator .generate (text , text_color )
6364 else :
64- image = computer_text_generator .generate (
65+ image , mask = computer_text_generator .generate (
6566 text ,
6667 font ,
6768 text_color ,
@@ -71,33 +72,40 @@ def generate(
7172 character_spacing ,
7273 fit ,
7374 )
74-
7575 random_angle = rnd .randint (0 - skewing_angle , skewing_angle )
7676
7777 rotated_img = image .rotate (
7878 skewing_angle if not random_skew else random_angle , expand = 1
7979 )
8080
81+ rotated_mask = mask .rotate (
82+ skewing_angle if not random_skew else random_angle , expand = 1
83+ )
84+
8185 #############################
8286 # Apply distorsion to image #
8387 #############################
8488 if distorsion_type == 0 :
8589 distorted_img = rotated_img # Mind = blown
90+ distorted_mask = rotated_mask
8691 elif distorsion_type == 1 :
87- distorted_img = distorsion_generator .sin (
92+ distorted_img , distorted_mask = distorsion_generator .sin (
8893 rotated_img ,
94+ rotated_mask ,
8995 vertical = (distorsion_orientation == 0 or distorsion_orientation == 2 ),
9096 horizontal = (distorsion_orientation == 1 or distorsion_orientation == 2 ),
9197 )
9298 elif distorsion_type == 2 :
93- distorted_img = distorsion_generator .cos (
99+ distorted_img , distorted_mask = distorsion_generator .cos (
94100 rotated_img ,
101+ rotated_mask ,
95102 vertical = (distorsion_orientation == 0 or distorsion_orientation == 2 ),
96103 horizontal = (distorsion_orientation == 1 or distorsion_orientation == 2 ),
97104 )
98105 else :
99- distorted_img = distorsion_generator .random (
106+ distorted_img , distorted_mask = distorsion_generator .random (
100107 rotated_img ,
108+ rotated_mask ,
101109 vertical = (distorsion_orientation == 0 or distorsion_orientation == 2 ),
102110 horizontal = (distorsion_orientation == 1 or distorsion_orientation == 2 ),
103111 )
@@ -115,6 +123,7 @@ def generate(
115123 resized_img = distorted_img .resize (
116124 (new_width , size - vertical_margin ), Image .ANTIALIAS
117125 )
126+ resized_mask = distorted_mask .resize ((new_width , size - vertical_margin ))
118127 background_width = width if width > 0 else new_width + horizontal_margin
119128 background_height = size
120129 # Vertical text
@@ -126,6 +135,9 @@ def generate(
126135 resized_img = distorted_img .resize (
127136 (size - horizontal_margin , new_height ), Image .ANTIALIAS
128137 )
138+ resized_mask = distorted_mask .resize (
139+ (size - horizontal_margin , new_height ), Image .ANTIALIAS
140+ )
129141 background_width = size
130142 background_height = new_height + vertical_margin
131143 else :
@@ -135,21 +147,22 @@ def generate(
135147 # Generate background image #
136148 #############################
137149 if background_type == 0 :
138- background = background_generator .gaussian_noise (
150+ background_img = background_generator .gaussian_noise (
139151 background_height , background_width
140152 )
141153 elif background_type == 1 :
142- background = background_generator .plain_white (
154+ background_img = background_generator .plain_white (
143155 background_height , background_width
144156 )
145157 elif background_type == 2 :
146- background = background_generator .quasicrystal (
158+ background_img = background_generator .quasicrystal (
147159 background_height , background_width
148160 )
149161 else :
150- background = background_generator .picture (
162+ background_img = background_generator .picture (
151163 background_height , background_width
152164 )
165+ background_mask = Image .new ("RGB" , (background_width , background_height ), (0 , 0 , 0 ))
153166
154167 #############################
155168 # Place text with alignment #
@@ -158,45 +171,62 @@ def generate(
158171 new_text_width , _ = resized_img .size
159172
160173 if alignment == 0 or width == - 1 :
161- background .paste (resized_img , (margin_left , margin_top ), resized_img )
174+ background_img .paste (resized_img , (margin_left , margin_top ), resized_img )
175+ background_mask .paste (resized_mask , (margin_left , margin_top ))
162176 elif alignment == 1 :
163- background .paste (
177+ background_img .paste (
164178 resized_img ,
165179 (int (background_width / 2 - new_text_width / 2 ), margin_top ),
166180 resized_img ,
167181 )
182+ background_mask .paste (
183+ resized_mask ,
184+ (int (background_width / 2 - new_text_width / 2 ), margin_top ),
185+ )
168186 else :
169- background .paste (
187+ background_img .paste (
170188 resized_img ,
171189 (background_width - new_text_width - margin_right , margin_top ),
172190 resized_img ,
173191 )
192+ background_mask .paste (
193+ resized_mask ,
194+ (background_width - new_text_width - margin_right , margin_top ),
195+ )
174196
175197 ##################################
176198 # Apply gaussian blur #
177199 ##################################
178200
179- final_image = background .filter (
180- ImageFilter .GaussianBlur (
181- radius = (blur if not random_blur else rnd .randint (0 , blur ))
182- )
201+ gaussian_filter = ImageFilter .GaussianBlur (
202+ radius = blur if not random_blur else rnd .randint (0 , blur )
183203 )
204+ final_image = background_img .filter (gaussian_filter )
205+ final_mask = background_mask .filter (gaussian_filter )
184206
185207 #####################################
186208 # Generate name for resulting image #
187209 #####################################
188210 if name_format == 0 :
189211 image_name = "{}_{}.{}" .format (text , str (index ), extension )
212+ mask_name = "{}_{}_mask.png" .format (text , str (index ))
190213 elif name_format == 1 :
191214 image_name = "{}_{}.{}" .format (str (index ), text , extension )
215+ mask_name = "{}_{}_mask.png" .format (str (index ), text )
192216 elif name_format == 2 :
193217 image_name = "{}.{}" .format (str (index ), extension )
218+ mask_name = "{}_mask.png" .format (str (index ))
194219 else :
195220 print ("{} is not a valid name format. Using default." .format (name_format ))
196221 image_name = "{}_{}.{}" .format (text , str (index ), extension )
222+ mask_name = "{}_{}_mask.png" .format (text , str (index ))
197223
198224 # Save the image
199225 if out_dir is not None :
200226 final_image .convert ("RGB" ).save (os .path .join (out_dir , image_name ))
227+ if output_mask == 1 :
228+ final_mask .convert ("RGB" ).save (os .path .join (out_dir , mask_name ))
201229 else :
230+ if output_mask == 1 :
231+ return final_image .convert ("RGB" ), final_mask .convert ("RGB" )
202232 return final_image .convert ("RGB" )
0 commit comments