图像的6种读取方式

注意:cv2默认为 BGR顺序,而其他软件一般使用RGB,所以需要转换

# 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))  # <class 'PIL.JpegImagePlugin.JpegImageFile'>
I = np.array(I)

print('I.type:',type(I))  # <class 'numpy.ndarray'>
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))  # <class 'numpy.ndarray'>
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()
图片.png

图片.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容