最近用matplotlib遇到了一些坑,记录一下。python
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通道和单通道,浮点数组和整形数组。app
三通道的shape是(H,W,C)ui
对于这种状况,不论原数组取值范围是多少,默认按0-1范围处理,超出范围的直接进行clip操做。也就是小于0的数按0(纯黑色)处理,大于1的按1(纯白)处理。code
同时会给出警告:orm
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()
暂时不贴图了,能够本身试一试效果。ip
结果应该是灰色背景,从上到下依次是白、黑、浅灰三个横向条带。input
若是数组是真实rgb值,建议先归一化到0-1,即x=x/255.
。it
单通道的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处理,对于单通道数组,默认将数组范围线性映射到对应类型的处理范围。