python matplotlib的使用

读取图像并显示

import matplotlib.pyplot as plt # plt 用于显示图片
import matplotlib.image as mpimg # mpimg 用于读取图片
import numpy as np

img = mpimg.imread('flower-631765_1280.jpg') 
#此时img就已经是一个 np.array 了,可以对它进行任意处理
print(img.shape) #(750, 1280, 3)

plt.imshow(img) # 显示图片
plt.axis('off') # 不显示坐标轴

显示某个通道

# 显示图片的第一个通道
img_R = img[:,:,0]
plt.figure()   #创建figure是创建一个新的窗口,否则只会弹出一个窗口,后一个图像会覆盖前一个图像,最终只显示最后一个图像
plt.imshow(img_R)
#plt.show()
# 此时会发现显示的是热量图,不是我们预想的灰度图,可以添加 cmap 参数,有如下几种添加方法:
plt.figure()
plt.imshow(img_R, cmap='Greys_r')

保存图片

plt.savefig('lena_new_sz.png')

此时保存的图像大小与显示的fig大小是一样的,也就是此时保存的图像比原图大小都变小了,此外还多了白框,并不是原本的一打开就是整张图的情况。那么如何在一定程度上消除白边呢,代码如下:

dpi=100  #一般300dpi就比较清晰了
fig = plt.figure(frameon=False)
fig.set_size_inches(im.shape[1]/dpi, im.shape[0]/dpi)
ax = plt.Axes(fig, [0., 0., 1., 1.])
ax.axis('off') #不显示坐标轴
fig.add_axes(ax)
ax.imshow(im) #显示图片
plt.savefig('flower.jpg',dpi = dpi)
plt.close('all') #当为批量处理图片时,每保存一个图片就关闭该窗口,否则会弹出很多

对于这种情况有的时候可以完全消除白边,有的时候会留一点,也不是很清楚为什么。

另外用matplotlib保存图片貌似每次都要先显示图片然后保存,如果不想让他弹出窗口直接就保存,需要在代码最开始添加

import matplotlib
matplotlib.use('Agg')

记住要在最开始 ,之后再import matplotlib中的其他东西。如果之后还出现以下提示:

../help_utils/help_utils.py:10: UserWarning:
This call to matplotlib.use() has no effect because the backend has already
been chosen; matplotlib.use() must be called *before* pylab, matplotlib.pyplot,
or matplotlib.backends is imported for the first time.

就在spyder,取消Activate support

根据坐标绘制矩形

已知矩形的左上角的坐标bbox[0](xmin),bbox[1](ymin),和右下角的坐标bbox[2](xmax),bbox[3](ymax)

color = (rand(), rand(), rand()) #matplotlib的颜色三通道是在0-1之间的
rect = plt.Rectangle((bbox[0], bbox[1]),
                      bbox[2] - bbox[0],
                      bbox[3] - bbox[1], fill=False,  #不填充
                      edgecolor=color, linewidth=2.5)
ax.add_patch(rect)

根据坐标绘制(不规则)多边形

已知一个矩阵,大小为n×2,n为多边形的定点数,2代表该点的x坐标和y坐标,代码如下:

import matplotlib.patches as mpathes
rect = [[15,15],[120,46],[60,190],[90,250]]  #是一个4个定点的不规则多边形
#创建多边形
rect = mpathes.Polygon(rect,fill=False,
                       edgecolor=color, linewidth=2.5) #不填充,线的宽度为2.5
ax.add_patch(rect)

绘制其他形状

参见网页https://matplotlib.org/api/patches_api.html

添加中文标注文本

要显示中文文本首先需要进行配置,见博客windows及ubuntu下解决matplotlib显示中文文本为方框的问题

ax.text(150, 150+10,  #标注的x y 坐标
         '你是标注',
        bbox=dict(facecolor='blue', alpha=0.5), #画一个背景为浅蓝色的框,在框上写字,alpha是浅蓝色框的透明度
        fontsize=10, color=color)

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值