python matplotlib在图像上指定位置加框的一些心得(深度学习图像标注可视化经常面临的问题)

matplotlib显示图像

  • 显示图像需要配合PIL库(python中pillow库)
  • 导入matplotlib.pyplot库
  • 导入matplotlib.patches库
# picdir是图片的路径
# 直接采用Image.open(picdir, 'r')的方法,没有关闭文件的方法,易导致内存泄漏
# 因此采用以下方法,通过二进制文件句柄的方式开和关闭

pf = open(picdir, 'rb')
img = Image.open(pf)
pf.close()

matplotlib在图像上添加标记框

# 注意这个方法是调用Patches在原图上绘制一个片
# facecolor设置为'none'可以使矩形框不填充颜色
# 坐标取的是左上角和宽度、高度
# patches添加的位置是轴句柄,而不是fig句柄

fig, ax1 = plt.subplots(1)
p = plt.imshow(img)
upleft = (x0, y0)
width = x1-x0
height = y1-y0
rect = patches.Rectangle(upleft, width, height, linewidth=0.3, edgecolor='r', facecolor='none')
ax1.add_patch(rect) 

matplotlib保存图像并去掉周边的空白

# 通过plt.gcf()选取前景,这样才能保证只绘制图像本身
# pad_inches设置为0
# bbox_inches设置为'tight'
# 提前将轴隐去

ax1.axis('off')
fig = plt.gcf()
fig.savefig(piccurrent+'.png', dpi=300, transparent=True, pad_inches=0, bbox_inches='tight')

matplotlib方法存在内存泄漏问题

  • imshow()这个方法总是在创建新的对象
  • 该对象没有办法自动关闭
  • 对大量图像进行循环操作时尤其需要注意这问题,内存是无法释放的
  • 针对这个问题,建议需要大量操作图像的用pillow自带的ImageDraw模块或者用cv模块来实现,matplotlib还是适用于少量的曲线绘制,数据呈现等。

你可能感兴趣的:(Python,深度学习,matplotlib,图像标注可视化)