# verify_channel.png 的shape为(10,5,3),沿着通道维度的第1,2,3(r,g,b)通道,都是 10x5的二维矩阵,每个矩阵的各处值相等,分别为:0,100,125
# method 1: PIL 中的 Image函数,PIL.Image.open()读入不是array()格式,这时候需要用 np.asarray()或者np.array()函数
# 区别是 np.array() 是深拷贝,np.asarray() 是浅拷贝
print('### PIL.Image:--------------------------')
from PIL import Image
import numpy as np
I = Image.open('./verify_channel.png') # 读取的方式为 RGB 顺序,所以三通道分别为 RGB
#I.show() # 读入的图片可以直接通过这种方式显示
#I.save("./save.png") # 和保存图片
print('变array之前,I.type: %s'%type(I)) #
I = np.array(I)
print('I.type:',type(I)) #
print('I.shape: ',I.shape) # (H, W, C)
print('PIL.Image: ',I[0,:,:]) # [ 0 100 255]
print('I.min(): %s, I.max(): %s'%(I.min(),I.max())) # [0, 255]
import matplotlib.pyplot as plt # matplotlib 使用 RGB 方式显示。
plt.imshow(I[:,:,:], cmap='gray')
plt.show()
# method 2: matplotlib.pyplot.imread 即 plt.imread()
print('### plt.imread:--------------------------')
import matplotlib.pyplot as plt
I = plt.imread('./verify_channel.png')
print('I.type:',type(I)) #
print('I.shape: ',I.shape) # (H, W, C)
print('PIL.Image: ',I[0,:,:]) # R,G,B
print('I.min(): %s, I.max(): %s'%(I.min(),I.max())) # [0, 1]
plt.imshow(I)
plt.show()
# method 3 : matplotlib.image 读取图片, 读入就是 array() 格式
# 利用matplotlib.pyplot as plt用于显示图片
print('### matplotlib.pyplt:--------------------------')
import matplotlib.pyplot as plt
import matplotlib.image as mping
I = mping.imread('./verify_channel.png')
print('I.type: ',type(I))
print('I.shape: ',I.shape) # (H, W, C)
print('matplotlib.image: ',I[1,:,:])
print('I.min(): %s, I.max(): %s'%(I.min(),I.max())) # 注意:一种读取方式读入不同的格式图像范围不一定一样: png:[0,1] jpg:[0, 255]
plt.imshow(I)
plt.show()
# method 4: 利用opencv-python接口
# cv2.imread()读出来同样是array形式,但是如果是单通道的图,读出来的是三通道的, 想要使用
print('### opencv:-----------------------------')
import cv2
I = cv2.imread('./verify_channel.png')
print('I.type: ',type(I))
print('I.shape: ',I.shape) # (H, W, C),不过沿着 C轴是 B,G,R三通道
print('matplotlib.image: ',I[1,:,:]) # 读入通道的顺序为 B G R
print('I.min(): %s, I.max(): %s'%(I.min(),I.max()))
plt.imshow(I) # 直接使用plt.imshow() 会让显示失真
plt.show()
I = np.array([I[:,:,2], I[:,:,1], I[:,:,0]]).transpose((1,2,0)) # 交换0和2通道才能使用plt.inshow()正常显示
plt.imshow(I)
plt.show()
# method 5: 使用 scipy 库,scipy.misc 读入
# 图像的存取我一般喜欢用scipy这个库里的东西,读出来是矩阵形式,并且scipy.misc.imsave()按照(H,W,C)形式保存
print('### scipy.misc:-----------------------------')
from scipy import misc
import scipy
I = misc.imread('verify_channel.png')
# scipy.misc.imsave('./save1.png', I)
print('I.type: ',type(I))
print('I.shape: ',I.shape)
print('matplotlib.image: ',I[1,:,:]) # 读入通道的顺序为 R G B
print('I.min(): %s, I.max(): %s'%(I.min(),I.max()))
plt.imshow(I)
plt.show()
# method 6:使用 skimage 库(这个库很强大)的 io模块,顾名思义,这个模块是用来图片输入输出操作的。
print('### skimage.io:-----------------------------')
from skimage import io
I = io.imread('./verify_channel.png')
#io.imshow(img)
print('I.type: ',type(I))
print('I.shape: ',I.shape)
print('matplotlib.image: ',I[1,:,:]) # 读入通道的顺序为 R G B
print('I.min(): %s, I.max(): %s'%(I.min(),I.max()))
plt.imshow(I)
plt.show()