matplotlib数组转图片的一些坑
2024-09-01 09:35:39
最近用matplotlib遇到了一些坑,记录一下。
图片转数组
import matplotlib.pyplot as plt
im_file='test_image.jpg'
img=plt.imread(im_file)
print(img.shape)
print(img.dtype)
# img: numpy array with shape (H,W,c)
# uint8
如上,类型是uint8的。
数组转图片
分为以下情况:3通道和单通道,浮点数组和整形数组。
三通道,浮点数组
三通道的shape是(H,W,C)
对于这种情况,不论原数组取值范围是多少,默认按0-1范围处理,超出范围的直接进行clip操作。也就是小于0的数按0(纯黑色)处理,大于1的按1(纯白)处理。
同时会给出警告:
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).
如果不加cmap='gray'
的话,默认显示热度图。
# float array, 3 channels
# For float array with 3 channels, by default the values out of range [0,1] are **Clipped** !
x=np.ones([500,600,3])
x*=0.4
for i in range(100,200):
x[i]=np.ones([600,3])*9
for i in range(250,300):
x[i]=np.ones([600,3])*-2
for i in range(370,400):
x[i]=np.ones([600,3])*0.7
print(x.dtype)
plt.imshow(x)
plt.axis('off')
plt.show()
暂时不贴图了,可以自己试一试效果。
结果应该是灰色背景,从上到下依次是白、黑、浅灰三个横向条带。
如果数组是真实rgb值,建议先归一化到0-1,即x=x/255.
。
单通道,浮点数组
单通道的shape是二维的(H,W),如果是(H,W,1)会报错。
对于单通道数组,默认进行归一化,即原数组中最大值被映射到1,最小值被映射到0。
# float array, 1 channel
# For float array with 1 channels, by default all values are normalized
x=np.ones([500,600])
x*=100
for i in range(100,200):
x[i]=np.ones([600])*200
print(x.dtype)
plt.imshow(x,cmap='gray')
plt.axis('off')
plt.show()
结果是黑色背景白色条带。
使用plt.imshow(x,cmap='gray', clim=(0,255))
,即将0作为黑色,将255作为白色处理。
三通道,整形
默认会对超出0-255的部分进行clip处理。即小于0视为0(黑色),大于255视为255(白色)。
# int array, 3 channels
x=np.ones([500,600,3])
x*=100
for i in range(100,200):
x[i]=np.ones([600,3])*900
for i in range(250,300):
x[i]=np.ones([600,3])*-2
for i in range(370,400):
x[i]=np.ones([600,3])*200
x=x.astype(np.int64)
print(x.dtype)
plt.imshow(x)
plt.axis('off')
plt.show()
单通道,整形
默认情况下,最小值映射到0(黑色),最大值映射到255(白色)。
# int array, 1 channel
# For int array, by default the array range is mapped to [0,255].
x=np.ones([500,600])
x*=100
for i in range(100,200):
x[i]=np.ones([600])*175
x=x.astype(np.int64)
print(x)
print(x.dtype)
plt.imshow(x,cmap='gray')
plt.axis('off')
plt.show()
同上,如果数组本身是真实灰度值,使用plt.imshow(x,cmap='gray',clim=[0,255])
处理。
总结
matplotlib读取jpg图片时,默认是uint8类型的numpy数组。
在将numpy数组转图片显示时,浮点形默认处理范围是0-1,整形默认处理范围是0-255。
对于三通道数组,超出范围的进行clip处理,对于单通道数组,默认将数组范围线性映射到对应类型的处理范围。
最新文章
- Windows英文版GitHub客户端使用操作流程图文攻略教程现没中文版
- Silverlight管理系统源代码(SilverlightOAFlame开发框架主要提供二次开发)
- urlrewriter的使用
- 闲聊Redshift与日本CG行业的近况
- Unsupervised Classification - Sprawl Classification Algorithm
- 2879: [Noi2012]美食节 - BZOJ
- [AngularJS] ngAnimate angular way !!
- memcpy的使用方法总结
- tyvj 普通平衡树 SBT or splay
- python 3.5 购物小程序
- PHP mysqli类
- C和C++混合编程之 extern “C”的使用
- C#中if_else以及for循环的简单理解
- Android LruCache技术原理
- 神奇的Redis延迟
- jQuery的ajax跨域 Jsonp原理
- 关于最短路的想法&;&;问题
- [FMX]将 Android 程序切换到后台及从后台切换到前台实现
- input 标签禁止输入
- lintcode-442-实现 Trie
热门文章
- Linux 磁盘原理与管理 (分区 挂载)
- 在Kali linux下使用docker配置sqli-labs(国内源的配置和系统软件更新)
- SecureCRT的下载、安装( 过程非常详细!!值得查看)
- MySQL导出数据时提示文件损坏
- scons自动化构建工具
- Ubuntu系统下使用php7+mysql+apache2搭建自己的博客
- C#上位机之—WinForm实现串口通信示例
- Python中verbaim标签使用详解
- html网页基本结构
- Codeforces Round #340 (Div. 2) E	 XOR and Favorite Number 莫队板子