最近用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数组转图片的一些坑的更多相关文章

  1. 微信JS-SDK选择图片遇到的坑

    微信JS-SDK选择图片遇到的坑 有个需求要在微信企业号里面做开发,有个功能是选择图片,使用input标签肯定是不管用了,Android手机上不能多选,所以使用了微信的JS-SDK提供的相关API,这 ...

  2. JS数组追加数组采用push.apply的坑

    JS数组追加数组没有现成的函数,这么多年我已经习惯了a.push.apply(a, b);这种自以为很酷的,不需要写for循环的写法,一直也没遇到什么问题,直到今天我要append的b是个很大的数组时 ...

  3. JS数组追加数组采用push.apply的坑(转)

    JS数组追加数组没有现成的函数,这么多年我已经习惯了a.push.apply(a, b);这种自以为很酷的,不需要写for循环的写法,一直也没遇到什么问题,直到今天我要append的b是个很大的数组时 ...

  4. 小程序数组型图片自适应效果的实现(交流QQ群:604788754)

    //本例代码如有问题,请加群,下载今日日期文件,测试.(如对本例有疑问,也可加群咨询群主) WXML: <view class="imgbox"> <block ...

  5. 利用numpy实现多维数组操作图片

    1.上次介绍了一点点numpy的操作,今天我们来介绍它如何用多维数组操作图片,这之前我们要了解一下色彩是由blue ,green ,red 三种颜色混合而成,0:表示黑色 ,127:灰色 ,255:白 ...

  6. Android 图片裁剪踩坑

      今天做图库图片的裁剪遇到了不少坑,今天记录一下,以下坑位供各位看官参考: 如果有不对之处,欢迎各位看官留言评论! 图片裁剪踩坑锦囊: 问题一:相册裁剪权限问题 解:这个简单,对于Android6. ...

  7. 四 numpy操作数组输出图片

    一.读取一张图片,修改颜色通道后输出 # -*- coding=GBK -*- import cv2 as cv import numpy as np #numpy数组操作 def access_pi ...

  8. UWP&WP8.1 重新绘制图片 WriteableBitmap用法 图片转byte[]数组,byte[]数组转图片

    ---恢复内容开始--- WriteableBitmap 是UWP和WP8.1绘制图片的,重组图片的最重要方法.方法较为简单,方法多样性. 通过查看文档,WriteableBitmap的继承性是    ...

  9. 从1500万用户巅峰跌落的app,血泪回顾图片社交那些坑

    饭桌君说 第八届小饭桌创业课堂来了一位特殊的分享嘉宾,他曾经参与了一款当时极具风头的图片社交app的创始团队,靠谱团队,用户量急速上升到1500万,公司获得A轮……一切看上去都那么美好. 可是,由于各 ...

随机推荐

  1. lwip eth插拔网线自动维护接口状态

    硬件连线就是将dp83848的INT脚连到STM32的某个中断脚上,这里是PB14 PB14的中断处理函数中,会释放一个信号量,这里只是发生链路状态改变中断(网线插上或拔下) void EXTI15_ ...

  2. typeof和类型转换

    编程形式 ① 面向过程 ② 面向对象 ③ Js既面向过程又面向对象 typeof(数据) 1)typeof(数据)返回该数据是什么类型的 2)写法: ① typeof(数据) ② typeof 数据 ...

  3. 学Python必背的初级单词,你都背了吗?

    今天给大家分享一些学习Python必须认识的英文单词,同时也是学习编程都必须会的单词,新手赶快学起来!有点长耐心看完. 小编推荐一个学Python的学习裙:九三七六六七 五零九,无论你是大牛还是小白, ...

  4. 让$(window).scroll()监听事件只执行一次

    可以用jQuery中的unbind()来进行事件解绑. $(window).scroll(function() { console.log("滚离顶部" + $(document) ...

  5. 全国省市,4个直辖市geoCoord数据,用于echart gl 3d地图

    var geoCoordMap = { '北京': [116.4551, 40.2539], '东城区':[116.418757,39.917544], '西城区':[116.366794,39.91 ...

  6. CODEFORCES ROUND#624 DIV3

    这次比赛从名字就可以看出非常水,然鹅因为第一次打codeforces不太熟悉操作只来的及做签到题(还错了一次) A,B,C都是签到题考点思维就不写了 D题 https://codeforces.ml/ ...

  7. 03.JS运算符

    前言:   学习一门编程语言的基本步骤 (01)了解背景知识 (02)搭建开发环境 (03)语法规范 (04)常量和变量 (05)数据类型 (06)数据类型转换 (07)运算符7.运算符 表达式:由运 ...

  8. ssh远程连接到Ubuntu

    1.ubuntu首先得安装ssh sudo apt-get install openssh-server 2.启动ssh sudo /etc/init.d/ssh start 3.检查是否开启 ps ...

  9. 测试.NET core MiddleWare 运行逻辑

    话不多说,直接开整. 首先创建一个.NET CORE web 工程,创建完成之后,会自动创建相关文件如图(本示例基于.NET CORE 3.0): 打开Startup.cs可以看到在Configure ...

  10. 【Java】简易Socket连接实现

    客户端: import java.io.*; import java.net.Socket; import java.text.SimpleDateFormat; import java.util.D ...