matplotlib数组转图片的一些坑
最近用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处理,对于单通道数组,默认将数组范围线性映射到对应类型的处理范围。
matplotlib数组转图片的一些坑的更多相关文章
- 微信JS-SDK选择图片遇到的坑
微信JS-SDK选择图片遇到的坑 有个需求要在微信企业号里面做开发,有个功能是选择图片,使用input标签肯定是不管用了,Android手机上不能多选,所以使用了微信的JS-SDK提供的相关API,这 ...
- JS数组追加数组采用push.apply的坑
JS数组追加数组没有现成的函数,这么多年我已经习惯了a.push.apply(a, b);这种自以为很酷的,不需要写for循环的写法,一直也没遇到什么问题,直到今天我要append的b是个很大的数组时 ...
- JS数组追加数组采用push.apply的坑(转)
JS数组追加数组没有现成的函数,这么多年我已经习惯了a.push.apply(a, b);这种自以为很酷的,不需要写for循环的写法,一直也没遇到什么问题,直到今天我要append的b是个很大的数组时 ...
- 小程序数组型图片自适应效果的实现(交流QQ群:604788754)
//本例代码如有问题,请加群,下载今日日期文件,测试.(如对本例有疑问,也可加群咨询群主) WXML: <view class="imgbox"> <block ...
- 利用numpy实现多维数组操作图片
1.上次介绍了一点点numpy的操作,今天我们来介绍它如何用多维数组操作图片,这之前我们要了解一下色彩是由blue ,green ,red 三种颜色混合而成,0:表示黑色 ,127:灰色 ,255:白 ...
- Android 图片裁剪踩坑
今天做图库图片的裁剪遇到了不少坑,今天记录一下,以下坑位供各位看官参考: 如果有不对之处,欢迎各位看官留言评论! 图片裁剪踩坑锦囊: 问题一:相册裁剪权限问题 解:这个简单,对于Android6. ...
- 四 numpy操作数组输出图片
一.读取一张图片,修改颜色通道后输出 # -*- coding=GBK -*- import cv2 as cv import numpy as np #numpy数组操作 def access_pi ...
- UWP&WP8.1 重新绘制图片 WriteableBitmap用法 图片转byte[]数组,byte[]数组转图片
---恢复内容开始--- WriteableBitmap 是UWP和WP8.1绘制图片的,重组图片的最重要方法.方法较为简单,方法多样性. 通过查看文档,WriteableBitmap的继承性是 ...
- 从1500万用户巅峰跌落的app,血泪回顾图片社交那些坑
饭桌君说 第八届小饭桌创业课堂来了一位特殊的分享嘉宾,他曾经参与了一款当时极具风头的图片社交app的创始团队,靠谱团队,用户量急速上升到1500万,公司获得A轮……一切看上去都那么美好. 可是,由于各 ...
随机推荐
- [Redis-CentOS7]Redis哈希操作(五)
哈希相当于下面Python代码 { "person":{ "name": "peigy", "age": "1 ...
- 杭电-------2045不容易系列之(3)—— LELE的RPG难题(C语言写)
/* 当最后一个块可以和第一个块染相同颜色时,答案为:3*pow(2,n-1);但是最后一块不能和第一块颜色相同,则减去和第一 块颜色相同的染色种数即可 3*pow(2,n-1)-ranse(n-1) ...
- 文本段落缩进text-indent:2em
中文文字中的段前习惯空两个文字的空白,这个特殊的样式可以用下面代码来实现: p{text-indent:2em;} <p>1922年的春天,一个想要成名名叫尼克卡拉威(托比?马奎尔Tobe ...
- OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c0000000, 1073741824, 0) failed; error='Out of memory' (errno=12)
使用docker 安装kafka时启动失败 查看报错日志 # docker logs --since 30m 71846a96e514 Excluding KAFKA_HOME from broker ...
- 【转】Redis内部数据结构详解 -- skiplist
本文是<Redis内部数据结构详解>系列的第六篇.在本文中,我们围绕一个Redis的内部数据结构--skiplist展开讨论. Redis里面使用skiplist是为了实现sorted s ...
- Django框架的初使用-2
目录 Django框架的初使用-1 1 Django MVT回顾 2 模型M 2.1 ORM框架 2.2 模型设计 3 视图V 3.1 定义视图函数 3.2 配置URLconf 3.3 视图-匹配过程 ...
- Redis 为什么这么快?
1. 纯内存操作,肯定快 数据存储在内存中,读取的时候不需要进行磁盘的 IO 2. 单线程,无锁竞争损耗 单线程保证了系统没有线程的上下文切换 使用单线程,可以避免不必要的上下文切换和竞争条件,没有多 ...
- java设计模式学习笔记--开闭原则
基本介绍 1.开闭(ocp)原则时编程中最基础.最重要的设计原则 2.一个软件实体如类.木块和函数应该对扩展开放,对修改关闭.用抽象构建框架,用实现扩展细节.即对提供方开放,对使用方关闭. 3.当软件 ...
- Vue中的$Bus使用
Vue中的$Bus使用 将Bus单独抽离成一个文件 Bus.js import Vue from 'vue'; let Bus = new Vue(); export default Bus; 创建两 ...
- mysql简单备份与恢复
1.备份 mysqldump -u root -h 127.0.0.1 -p --set-gtid-purged=OFF abc > /data/mysqlBak/abc_20200206.s ...