522 字
3 分钟
Python ImageDraw几何图形与文字绘制
2022-01-30

前言#

介绍一个 Python 的库,在图像上绘制集合图形和文字很好用: PIL.ImageDraw

之前想在图像上绘制矩形进行内容标注都是通过自己写个循环处理的,直到最近有了点时间,我尝试去翻了翻 Yolo 代码的时候,我看到了 Yolo 中 Annotator 这个库。

它实现目标标注所打的框和文字标识就是如下代码:

def rectangle(self, xy, fill=None, outline=None, width=1):
# Add rectangle to image (PIL-only)
self.draw.rectangle(xy, fill, outline, width)
def text(self, xy, text, txt_color=(255, 255, 255)):
# Add text to image (PIL-only)
w, h = self.font.getsize(text) # text width, height
self.draw.text((xy[0], xy[1] - h + 1), text, fill=txt_color, font=self.font)

我好奇这个 self.draw 是怎么画图的,又找到了该成员的定义和导入:

from PIL import ImageDraw
self.draw = ImageDraw.Draw(self.im)

ImageDraw#

在使用这个库里的方法之前,我们需要先创建一个绘制对象:

from PIL import Image, ImageDraw
pilImg = Image.new('RGB', (500, 500), (255, 255, 255))
draw = ImageDraw.Draw(pilImg) # 创建绘制对象

注意:ImageDraw 只支持对 PIL 格式的图片进行绘制,对 np.array() 的不支持 两者的转换方法可以见:Python Numpy图像与PIL图像相互转换

下面是一些这个库里常用的绘图函数1

方法说明
draw.line()直线
((x1, y1, x2, y2), fill=“red”, width=10) (端点坐标, 填充颜色, 宽度)
draw.rectangle()矩形
((x1, y1, x2, y2), fill=“red”, outline=“blue”, width=10) (左上右下, 填充颜色, 边界颜色, 宽度)
draw.ellipse()圆/椭圆
注意:左上坐下,是指定椭圆的外切矩形,如果是正方形,椭圆就会变成圆
draw.polygon()多边形
按(x1, y1, x2, y2 …)的格式填入多个点
draw.text()文字
建议看具体方法,比较长,只写常用的几个参数
(xy, text, fill, font) (文本左上角, 文本, 填充/文本颜色, 字体)

吐槽一下其中的 draw.point() 方法,真就只能标记单个像素,如果想标记一个明显的点,还是用画个圆来的比较好:

def point(self, xy: _XY, fill: _Ink | None = …) -> None: …

Footnotes#

  1. 【python图像处理】几何图形的绘制与文字的绘制(ImageDraw类详解)

Python ImageDraw几何图形与文字绘制
https://fuwari.vercel.app/posts/编程/python/python-imagedraw几何图形与文字绘制/
作者
Asuwee
发布于
2022-01-30
许可协议
CC BY-NC-SA 4.0