当前位置: 代码迷 >> 综合 >> 【Opencv、ImageDraw、Matplotlib、Pandas、Seaborn】一些常见的画图函数
  详细解决方案

【Opencv、ImageDraw、Matplotlib、Pandas、Seaborn】一些常见的画图函数

热度:79   发布时间:2023-12-14 09:30:30.0

一、CV2

OpenCV只能操作np.array格式的图像im [x1 y1 x2 y2] 左上角 + 右下角

1.1、cv2.rectangle

在im上画出框框

cv2.rectangle(img, pt1, pt2, color, thickness=None, lineType=None, shift=None)

参数:

  1. img: 要绘制的图像
  2. pt1: 矩形的左上角坐标 / 左下角坐标
  3. pt2: 矩形的右下角坐标 / 右上角坐标 ( p1和p2一定要相对)
  4. color: 矩形边框或者填充的颜色/亮度
  5. thickness: 矩形边框的粗细。负值表示使用 color 填充整个矩形
  6. lineType:矩形边框的线型
  7. shift:坐标中的小数位数

返回:无

1.2、cv2.getTextSize

返回文本 label 的宽高 (width, height)

retval, baseLine = cv2.getTextSize(text, fontFace, fontScale, thickness)

参数:

  1. text: 要计算的文本 label
  2. fontFace: 要使用的字体 经常用0
  3. fontScale: 乘以特定字体基本大小的比例因子 字体缩放系数
  4. thickness: 文本的线的粗细

返回:

  1. retval:字体的宽高 (width, height)
  2. baseLine :相对于最底端文本的 y 坐标

1.3、cv2.putText

在图片上写文本

putText(img, text, org, fontFace, fontScale, color, thickness=None, lineType=None, bottomLeftOrigin=None)

参数:

  1. img:要绘制的图像
  2. text: 要写上前的label信息 + score
  3. org:文本左下角坐标
  4. fontFace:要使用的字体 经常用0
  5. fontScale:乘以特定字体基本大小的比例因子 字体缩放系数
  6. color:字体的颜色
  7. thickness:字体的线的粗细
  8. lineType:矩形边框的线型

1.4、cv2.imwrite

cv2.imwrite(file,img,num)

参数:

  1. file:要保存的文件名
  2. img:要保存的图像 一般是RGB格式 cv2.cvtColor(mosaic, cv2.COLOR_BGR2RGB)
  3. num:它针对特定的格式:对于JPEG,其表示的是图像的质量,用0 - 100的整数表示,默认95;对于png ,第三个参数表示的是压缩级别。默认为3. 【可选参数 一般不怎么用】

二、Image、ImageDraw、ImageFont

ImageDraw只能操作Image格式的图像im [x1 y1 x2 y2] 左上角 + 右下角
im = Image.fromarray(im) 将im从np.array格式 -> Image格式
im = np.asarray(im) 将im从Image格式 -> np.array格式

draw = ImageDraw.Draw(im)
(初始化)创建一个可以在给定图像(im)上绘图的对象,在之后调用draw.函数的时候不需要传入im参数,它是直接针对im上进行绘画的

font = ImageFont.truetype(“Arial.ttf”, size=max(round(max(im.size) / 40), 12))
加载一个TrueType或者OpenType字体文件(“Arial.ttf”), 并且创建一个字体对象font, font写出的字体大小size=12

2.1、draw.rectangle

rectangle(self, xy, fill=None, outline=None, width=1)
参数:

  1. xy:box [x1 y1 x2 y2] 左上角 + 右下角
  2. fill:将整个矩形填充颜色color
  3. outline:矩形外框颜色color
  4. width: 线宽

返回:None

2.2、font.getsize

txt_width, txt_height = font.getsize(label)

返回给定文本label的宽度txt_width和高度txt_height

2.3、draw.text

draw.text(xy , text, fill, font=font)

xy: 左上角坐标
label:显示的文本信息
fill: 文本的颜色
font:文本字体

2.4、Image.save

Image.fromarray(img).save(fname)
保存之前必须将图片img从numpy array格式转为tensor格式,fname为保存的文件名

三、matplotlib.pyplot

import matplotlib.pyplot as plt

3.1、plt.figure

创建自定义图像 初始化画布
fig = plt.figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)

参数:

  1. num:图像编号或名称,数字为编号 ,字符串为名称 (不怎么用)
  2. figsize:figure的宽和高 单位为英寸 (重要)
  3. dpi:参数指定绘图对象的分辨率 (不怎么用)
  4. facecolor:背景颜色
  5. edgecolor:边框颜色
  6. frameon:是否显示边框
  7. tight_layout:当发生轴标签、标题、刻度标签等等超出图形区域,是否自动调整子图参数,使之填充整个图像区域

fig.savefig(‘comparison.png’, dpi=200) plt绘完图,fig.savefig()保存图片

3.2、plt.plot

绘制折线图 可以任意加几条线
plt.plot(x, y, format_string,**kwargs)

参数:

  1. x: x坐标
  2. y: y坐标
  3. format_string:曲线显示类型 如’.-’

如:plt.plot(x, ya, ‘.-’, label=‘YOLOv3’)

也可以同时在一个图上画几个散点图,加上:
plt.plot(x, yb ** 2, ‘.-’, label=‘YOLOv5 ^2’)
plt.plot(x, yb ** 1.6, ‘.-’, label=‘YOLOv5 ^1.6’)

3.3、plt.xlim、 plt.ylim

设置x轴、y轴范围
如:plt.xlim(left=-4, right=4) 和 plt.ylim(bottom=0, top=6)

3.4、plt.xlabel、plt.ylabel

设置x轴、y轴标签
如:plt.xlabel(‘input’)、plt.ylabel(‘output’)

3.5、plt.grid()

生成网格 如plt.grid()

3.6、plt.legend

加上图例 如果是折线图,需要在plt.plot中加入label参数((图例名))如:
plt.plot(x, ya, ‘.-’, label=‘YOLOv3’)

plt.legend()

3.7、 plt.savefig

plt.savefig(Path(save_dir) / ‘LR.png’, dpi=200)

3.8、plt.subplots

fig, ax = plt.subplots(2, 2, figsize=(6, 6), tight_layout=True)

在figure上创建2行2列的子图
figure 的 size 是(6,6)
tight_layout=True:会自动调整子图参数, 使之填充整个图像区域

返回fig:绘图对象 ax :坐标对象

ax.set_aspect(‘equal’) # 设置两个轴的长度始终相同 figure为正方形
ax = ax.ravel() # 将多维数组降位一维

ax[0].plot(x, y, marker=’.’, linewidth=2, markersize=8) # 画子图 折现图
ax[i].set_title(s[i]) # 设置子图标题

3.9、直方图

ax.hist2d(cx, cy, bins=600, cmax=10, cmin=0)
双直方图 cx: x坐标
cy: y坐标
bins: 横竖分为几条
cmax、cmin: 所有的bins的值少于cmin和大于cmax的不显示

ax[0].hist(cx, bins=600)
正常直方图 cx: 绘图数据
bins: 直方图的长条形数目
normed: 是否将得到的直方图向量归一化
facecolor: 长条形的颜色
edgecolor:长条形边框的颜色
alpha:透明度

使用np画直方图:

hist, xedges, yedges = np.histogram2d(x, y, (xedges, yedges))
x: x轴坐标
y: y轴坐标
(xedges, yedges): bins x, y轴的长条形数目
返回:
hist: 直方图对象
xedges: x轴对象
edges: y轴对象

使用:hist[xidx, yidx]

3.10、plt.scatter 散点图

plt.scatter(y, f, c=hist2d(y, f, 20), cmap=‘viridis’, alpha=.8, edgecolors=‘none’)
x, y: x y 坐标列表
c: 色彩或颜色
cmap: Colormap实例
edgecolors: 边框颜色

四、pandas、seaborn

4.1、pd.DataFrame

x = pd.DataFrame(b, columns=[‘x’, ‘y’, ‘width’, ‘height’])
创建DataFrame, 类似于一种excel,表头是[‘x’, ‘y’, ‘width’, ‘height’] 表数据是b

4.2、seaborn.pairplot: 联合分布图

用于绘制多变量联合分布图: 查看两个或两个以上变量之间两两相互关系的可视化形式
需要和pd.DataFrame联合使用:

x = pd.DataFrame(b.transpose(), columns=[‘x’, ‘y’, ‘width’, ‘height’])
sn.pairplot(x, corner=True, diag_kind=‘auto’, kind=‘hist’, diag_kws=dict(bins=50), plot_kws=dict(pmax=0.9))

data = x是联合分布数据
corner = True 表示只显示左下侧 因为左下和右上是重复的
diag_kind:表示联合分布图中对角线图的类型
kind:表示联合分布图中非对角线图的类型
plot_kws,diag_kws: 可以接受字典的参数,对图形进行微调

4.3、seanborn.heatmap: 热力图

热力图(heatmap)可通过颜色深浅变化,优雅的展示数据的差异

参数:
data: 数据矩阵;
annot: 为True时为每个单元格写入数据值 False用颜色深浅表示;
annot_kws: 格子外框宽度;
fmt: 添加注释时要使用的字符串格式代码;
cmap: 指色彩颜色的选择;
square: 是否是正方形;
xticklabels、yticklabels: xy标签;

  相关解决方案