生成样本用来训练DB,一开始代码如下
from PIL import Image, ImageFont, ImageDraw
text_img = Image.new('RGBA', (3000, 300))
draw = ImageDraw.Draw(text_img)
font_color = (256, 256, 256)
file = r'C:\Users\think\Desktop\ocr-gen\fonts\STSONG.TTF'
font = ImageFont.truetype(file, size=128)
text = '一二三四五'
w, h = font.getsize(text[0])
draw.text((x, y), text[0], font=font, fill=font_color)
text_img.crop(x, y, x + w, y + h)
show出来后发现大部分文字在框的偏下位置,框的上方有空白而不是紧贴着文字。后来发现draw.text在生成文字时左上方有offset,于是代码改动如下
text = '一二三四五'
w, h = font.getsize(text[0])
offset_x, offset_y = font.getoffset(text[0])
draw.text((x, y), text[0], font=font, fill=font_color)
text_img.crop(x + offset_x, y + offset_y, x + offset_x + w, y + offset_y + h)
结果show出来又发现框还是没有紧贴文字,再查找资料后发现了参考博客中的下图
如图所示,文字的左上角除了offset之外还有一定的偏移,而且右边和下边也有offset,最终代码如下
text = '一二三四五'
offset_x, offset_y = font.getoffset(text[0])
xmin, ymin, xmax, ymax = font.getmask(text[0]).getbbox()
draw.text((x, y), text[0], font=font, fill=font_color)
text_img.crop(x + offset_x + xmin, y + offset_y + ymin, x + offset_x + xmax, y + offset_y + ymax)
即使是这样,对于不同的字,或者同一个字,四周可能有的边紧贴着,有的边会有1个像素的offset,不过可以忽略不计了
参考