matplotlib和OpenCV技巧
小锋学长生活大爆炸

matplotlib和OpenCV技巧

hualala
2022-01-27 / 0 评论 / 62 阅读
温馨提示:
本文最后更新于2022年09月19日,已超过796天没有更新,若内容或图片失效,请留言反馈。

直接在缓存中互读

import io
import numpy as np
import PIL
import matplotlib.pyplot as plt
 
#... fig = ...
#假设你有了一个绘图结果fig
 
#申请缓存
buffer_ = io.BytesIO()
fig.savefig(buffer_, format = "png")
buffer_.seek(0)
image = PIL.Image.open(buffer_)
#转换为numpy array
ar = np.asarray(image)
cv2.imshow("demo", ar)
#释放缓存
buffer_.close()

来源:https://blog.csdn.net/ngy321/article/details/80109088

OpenCV添加文字

cv2.putText(img, text, (40, 50), cv2.FONT_HERSHEY_PLAIN, 2.0, (0, 0, 255), 2)

格式互转

opencv默认BGR顺序,matplotlib和PIL默认RGB顺序。

# Image转cv2
cv2_img = cv2.cvtColor(numpy.asarray(Img_img),cv2.COLOR_RGB2BGR)

# cv2转Image
pil_img = Image.fromarray(cv2.cvtColor(cv_img,cv2.COLOR_BGR2RGB))

隐藏坐标轴文本刻度或刻度标签

# 隐藏包括轴标签的坐标轴
xaxis.set_visible(False)/yaxis.set_visible(False)
# 在 Matplotlib 中隐藏坐标轴
xaxis.set_ticks([])/yaxis.set_ticks([]) 
# 在 Matplotlib 中隐藏轴标签/文本
xaxis.set_ticklabels([])/yaxis.set_ticklabels([]) 
# 来隐藏 Matplotlib 中的坐标轴标签/文本
xticks(color='w')/yticks(color='w') 

来源:https://www.delftstack.com/zh/howto/matplotlib/how-to-hide-axis-text-ticks-and-or-tick-labels-in-matplotlib/

关闭1个fig

plt.close(fig)

保存时去除白边

# pad_inches=0:去除所有白边
# bbox_inches='tight':去除坐标轴占用的空间
plt.savefig(path, format='png', pad_inches=0, bbox_inches='tight')

调整图片间隙

fig.tight_layout()  # 调整整体空白
plt.subplots_adjust(wspace=0, hspace=0)  # 调整子图间距
plt.subplot_tool() # 提供了一种交互式方法来拖动 subplot_tool 中的条以更改子图的布局

取消边框

axes[i][j].spines['top'].set_visible(False)
axes[i][j].spines['right'].set_visible(False)
axes[i][j].spines['bottom'].set_visible(False)
axes[i][j].spines['left'].set_visible(False)
````

## 生成空白图

使用Numpy创建一张A4(2105×1487)纸

格式:h,w,c

img = np.zeros((2105,1487,3), np.uint8)

使用白色填充图片区域,默认为黑色

img.fill(255)


## 显示中文

plt.rcParams["font.sans-serif"]=["SimHei"] #设置字体
plt.rcParams["axes.unicode_minus"]=False #该语句解决图像中的“-”负号的乱码问题


## 显示双坐标

fig, axes = plt.subplots(nrows=3, ncols=3)

坐标1

axes0.set_title('aaa', fontsize=17)
axes0.set_xlim(0, len(all_algs)+1)
axes0.set_xticks(range(1, 10))
axes0.set_ylim(0, 105)
axes0.grid(True)

坐标2(子坐标)

ax2 = axes0.twinx()

具体用法跟上面一样

ax2.set_ylabel('Number')
ax2.set_ylim(0, 5)
ax2.bar(x, fine, color='b', alpha=0.4, width=0.4, label=alg)
ax2.legend(prop={'size': 11}, loc="upper right" , labelcolor='linecolor')


## 坐标显示中文

axes0.set_xticks([1, 2, 3], ['a', 'b', 'c'])


## 坐标轴倾斜

axes0.set_xticklabels(all_algs, rotation=15)


## 坐标轴显示分式
latex语法即可

axes.set_xlabel(r'aaa ($\frac{y}$)', fontsize=16)

0

评论 (0)

取消