读取图像并显示
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)