如何用Python在图片上绘制BoundingBox
2022/5/10 17:00:35
本文主要是介绍如何用Python在图片上绘制BoundingBox,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
参考资料:
https://blog.csdn.net/weixin_41735859/article/details/106599903
在目标检测等CV领域的任务里,经常会涉及到在图片上绘制BBox,也就是画一个矩形框把目标框起来,并且还可能会打上标签。这篇随笔记录一下在Python里如何在图片上绘制BoundingBox。
我的主要参考对象是参考资料里的方法,参考资料里给出了opencv和PIL来绘制的方法,考虑到大多数机器学习环境里都会有PIL/pillow(这玩意儿都快和python绑定了吧,是python原生的),所以我就记录一下用PIL绘制的方法(不用装新的包嘛!)废话不多说,直接放代码和效果图,并且附上详细的注释:
from PIL import Image, ImageDraw, ImageFont # 1.读取图片 real_im = T.ToPILImage()(XXX_1) bbox_list = XXX_2 label_list = XXX_3 # 2.设置字体格式及大小 font = ImageFont.truetype(font='./Courier-12.ttf', size=np.floor(1.5e-2 * np.shape(real_im)[1] + 10).astype('int32')) # 3.给画笔添加句柄(我就是要在real_im上画画!) draw = ImageDraw.Draw(real_im) for (label_, bbox_) in zip(label_list, bbox_list): # 4.获取边框坐标 # 最终边框格式 bbox = [xl, yl, xr, yr] bbox_[0], bbox_[1], bbox_[2], bbox_[3] = bbox_[0], bbox_[1], bbox_[0] + bbox_[2], bbox_[1] + bbox_[3] bbox_[0] = int(bbox_[0] * real_im.size[0]) bbox_[1] = int(bbox_[1] * real_im.size[1]) bbox_[2] = int(bbox_[2] * real_im.size[0]) bbox_[3] = int(bbox_[3] * real_im.size[1]) # 5.获取label长宽 label_size = draw.textsize(label_, font) # 6.设置label起点 text_origin = np.array([bbox_[0], bbox_[1] + 0.2 * label_size[1]]) # 7.随机一个RGB值作颜色 color_for_draw = tuple(np.random.randint(0, 255, size=[3])) # 8. 绘制矩形框,加入label文本 draw.rectangle([bbox_[0], bbox_[1], bbox_[2], bbox_[3]],outline=color_for_draw, width=2) draw.rectangle([tuple(text_origin), tuple(text_origin + label_size)], fill=color_for_draw) draw.text(text_origin, str(label_), fill=(255, 255, 255), font=font) # 9.删除画笔句柄 del draw
下面说一下几个要点:
- XXX_1这个地方需要是一个PIL.Image格式的图片,无论你是用torchvision里面的ToPIL搞出来,还是用Image.open打开图片哈文件,都需要是PIL.Image格式
- XXX_2这个地方是一个BBox的列表,众所周知需要四个值才能确定一个矩形,所以它的形状可能是(n, 4)的array。
- XXX_3这个地方是Label的列表,内容就是str,也就是我们想在对应BBox旁边打上的文字
- 这段代码最终生效的BBox是xl, yl, xr, yr格式,坐标系参考资料里面有,如果你的BBox做了归一化,或者是其他格式,你需要相应的调整。(我展示的代码里bbox值一开始是归一化的,并且是COCO的格式,[xl,yl,w,h])
- 上述代码可能不好直接跑通,包括ttf字体还得自己下载,但是希望你能读到并理解这个绘制的方法,就好。
这篇关于如何用Python在图片上绘制BoundingBox的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-21Python编程基础教程
- 2024-11-20Python编程基础与实践
- 2024-11-20Python编程基础与高级应用
- 2024-11-19Python 基础编程教程
- 2024-11-19Python基础入门教程
- 2024-11-17在FastAPI项目中添加一个生产级别的数据库——本地环境搭建指南
- 2024-11-16`PyMuPDF4LLM`:提取PDF数据的神器
- 2024-11-16四种数据科学Web界面框架快速对比:Rio、Reflex、Streamlit和Plotly Dash
- 2024-11-14获取参数学习:Python编程入门教程
- 2024-11-14Python编程基础入门