使用matplotlib绘制各种图像

最近由于论文的需要,要用到matplotlib绘制图像,这里顺便总结一下!

我是用cv2读取图片,最近发现了一个奇异的问题,在一个目录下用相对路径读取读片(相对路径没有英文),新建一个notebook文件可以读取,但是把别的地方的notebook文件拷贝过来就不行了,一直返回None,虽然不知道是什么原因,但以后需要注意啊!!!

1. 基本matplotlib设置

1
2
3
4
5
6
7
8
9
10
11
12
import cv2
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
# 设置中文字体为黑体
plt.rcParams['font.sans-serif'] = ['SimHei']
# 用来正常显示负号
plt.rcParams['axes.unicode_minus'] = False
def BGRTORGB(img):
return cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
def BGRTOGRAY(img):
return cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

2. 同时显示多个图像

因为matplotlib显示是从小到大排列,比如要显示10张图像,并分2为行显示,显示的子图序号是251252、…、2510,这是不行的,因为2510不被识别,因此采用这种方式显示图片有个数限制。

所以,用虽然用下面的方法可以同时显示多个图像,但是最多不超过10张。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 同时显示多个图像
"""
imgs 源图片列表,类型为list(或numpy数组)
names 源图片标题,类型为list(或numpy数组)
use_color 是否彩色显示,None为全部灰度显示,如果指定某一张图片彩色显示,也可以设置,例如[False,True,False],即执行第二种图片彩色显示
tfigsize 整个画布的尺寸
row 显示的行数,行数一定要被图片数整除
"""
def show_mutli_img(imgs,names,use_color=None,tfigsize=(10,10),row=1):
if use_color is None :
use_color = [False]*len(imgs)
plt.figure(figsize=tfigsize)
show_len=len(imgs)
gird=int(str(row)+str(show_len//row))*10;
r,i,c=0,0,0;
for r in range(row):
for i in range(show_len//row):
plt.subplot(gird+c+1)
if use_color[i]:
plt.imshow(imgs[c])
else: plt.imshow(imgs[c],cmap='gray')
plt.title(names[c])
c = c+1
plt.show()

3. 同时显示多个图像(无个数限制)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
"""
plt.subplot2grid创建子图
row,col分别为行、列,类型为int
data_img为存储图片的数组列表(或numpy数组),必须是(row,col)大小
data_title为存储对应图片的标题列表(或numpy数组),大小同上
"""
def show_data_img(data_img,data_title,row,col,tfigsize=(12,5)):
plt.figure(figsize=tfigsize)
plots = []
for i in range(row):
for j in range(col):
ax = plt.subplot2grid((row,col), (i,j))
ax.imshow(data_img[i][j],cmap='gray')
ax.set_title(data_title[i][j])
plt.show()

4. 多个大小不同的图像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 显示不同级别的小波图像
"""
使用plt.subplot2grid来创建多小图
- grid 表示将整个图像窗口分成几行几列,类型为tuple
- pos 表示从第几行几列开始作图,类型为list
- spans 表示这个图像行列跨度,类型为list
- titles 表示子图的标题,类型为list
"""
def show_levelImg(show_imgs,grid,pos,spans,titles,tfigsize=(10,10)):
plt.figure(figsize=tfigsize)
i = 0;
for i in range(len(pos)):
#行,列
trowspan,tcolspan = spans[i]
ax1 = plt.subplot2grid(grid, pos[i], rowspan=trowspan, colspan=tcolspan);
ax1.imshow(show_imgs[i],cmap='gray');ax1.set_title(titles[i]);ax1.axis('off')

可以运行一下看看效果:

1
2
3
4
5
6
# len(imgs) =7
grid = (4,4)
pos = [(0, 2),(2,0),(2,2),(0,0),(0,1),(1,0),(1,1)]
spans = [(2,2),(2,2),(2,2),(1,1),(1,1),(1,1),(1,1)]
titles = ['person1','person2','person3','person4','person5','ca1','car2']
show_levelImg(imgs,grid,pos,spans,titles)

5. 直方图

1
2
3
4
5
6
# 读取图像
img = cv2.imread("resource/lina.jpg")
img = BGRTORGB(img)
gray_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
plt.hist(gray_img.ravel(), 256);plt.title("直方图")
plt.show()

1
2
3
4
5
6
7
8
9
def show_hist_quantized(histogram_quantized):
plt.figure(figsize=(7,7))
plt.title(u"等分量化后的直方图")
plt.xlabel(u"等分index")
plt.ylabel(u"nums")
plt.bar(x=list(range(len(histogram_quantized))), height=histogram_quantized)
plt.show()
histogram_quantized = [50,40,30,60,70]
show_hist_quantized(histogram_quantized)

6. 坐标轴为整数的折线图

1
2
3
4
5
6
7
8
9
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
plt.title(u"a plot")
plt.xlabel(u"xxx")
plt.ylabel(u"yyy")
data = [13.4,4.6,7.8,9.9,5.5]
plt.xticks(range(len(data)))
plt.plot(data)