做图像视觉算法这一块经常会遇到读写图像的时候,现在读写图片的主流图像库有opencv,Pillow.Image,matplotlib.image,scipy.misc(已弃用),image.IO, skimage等,这些库读写图片的方式有些不太一样,光靠记很容易混淆,所以我写了此篇总结;另外还有其他深度学习框架也有读取图片的接口,但它们底层都是调用这些库,出入不大。
在实验之前先展示一下代码用到的示例图片(从网上下载的):
图片详细信息如下:
opencv:cv2.imread()
opencv是图像处理常用的工具库,非常强大,里面集成的算法非常多。
图片读取操作
可以看到opencv读进来是一个多维numpy矩阵,彩色图片维度是(高度,宽度,通道数)。数据类型是uint8。
以灰度图的方式读进来的矩阵格式是(高度,宽度)
如果图片路径是错误的,读出来的数据是None,不会报错
图片矩阵操作
opencv读入图片的矩阵格式是:(height,width,channels),而在深度学习中,pytorch会把图片通道数放在前面,比如(channels,height,width)。为了应对该要求,我们可以这么做
当需要对图片扩展一个维度,比如:(batch,channels,height,width),可以这样做
图片归一化
有时候训练也需要将图片做归一化处理,可以这样做
保存图片
访问像素
截取ROI区域
通道分离与合并
PIL: PIL.Image.open()
PIL即Python Imaging Library,也即为我们所称的Pillow,是一个很流行的图像库,它比opencv更为轻巧,常用于深度学习框架底层读取图片操作。
图片读写
可以看到,通过PIL.Image模块读取图片,返回的是一个Image类,而不是一个ndarray,要写显示图片,还需要将它转换成ndarray才行。
灰度图方式读取
保存图片
通道分离与合并
获取ROI区域
matplotlib:matplotlib.image.imread()
matplotlib,我主要用来绘图,用法和matlab很像,但它也可以读图片哦
imageio.imread()
skimage: skimage.io.imread()
可以看到图像也是以ndarray方式读入
灰度图方式读入如下:
可以看到,灰度图像的矩阵的值被归一化了,注意!!!
也可以以这种方式获得灰度图:
总结
- 除opencv读入的彩色图片以BGR顺序以外,其他均以RGB顺序存储。
- 除开PIL.Image模块读入的图片是image类以为,其他都是ndarray方式存储。
- skimage.io.imread()方式读入灰度图会被归一化。
- 无论用什么库读进图片,只要把图片改为ndarray矩阵形式,那么matplotlib就可以显示。