Python各类图像库的图片读写方式总结

最近在研究深度学习视觉相关的东西,经常需要写Python代码搭建深度学习模型。比如写CNN模型相关代码时,我们需要借助python图像库来读取图像并进行一系列的图像处理工作。我最常用的图像库当然是opencv,很强大很好用,但是opencv也有一些坑,不注意的话也会搞出大麻烦。近期我也在看一些别人写的代码,因为个人习惯不一样,他们在做深度学习时用于图片读取的图像库各不相同,从opencv到PIL再到skimage等等各种库都有,有些库读进来的图片存储方式也不太一样,如果不好好总结这些主流图像读写库特点的话,以后看代码写代码都会遇坑无数。这篇文章就总结了以下主流Python图像库的一些基本使用方法和需要注意的地方:

opencv

PIL(pillow)

matplotlib.image

scipy.misc

skimage

opencv: cv2.imread

opencv作为我最常用的图像处理库,当然第一个介绍,并且介绍得比较全面。毋庸置疑,opencv是今天介绍得所有图像库中最全面也最强大的库,如果我们只想掌握一个图像库,我觉得opencv库肯定是最适合不过了。

图片读取操作 import cv2 import numpy as np #读入图片:默认彩色图,cv2.IMREAD_GRAYSCALE灰度图,cv2.IMREAD_UNCHANGED包含alpha通道 img = cv2.imread('1.jpg') cv2.imshow('src',img) print(img.shape) # (h,w,c) print(img.size) # 像素总数目 print(img.dtype) print(img) cv2.waitKey()

Python各类图像库的图片读写方式总结

Python各类图像库的图片读写方式总结

值得注意的是,opencv读进来的图片已经是一个numpy矩阵了,彩色图片维度是(高度,宽度,通道数)。数据类型是uint8。

#gray = cv2.imread('1.jpg',cv2.IMREAD_GRAYSCALE) #灰度图 #cv2.imshow('gray',gray) #也可以这么写,先读入彩色图,再转灰度图 src = cv2.imread('1.jpg') gray = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY) cv2.imshow('gray',gray) print(gray.shape) print(gray.size) print(gray) cv2.waitKey()

Python各类图像库的图片读写方式总结

Python各类图像库的图片读写方式总结

上面提到了两种获取灰度图的方式,读进来的灰度图的矩阵格式是(高度,宽度)。

#注意,计算图片路径是错的,Opencv也不会提醒你,但print img时得到的结果是None img2 = cv2.imread('2.jpg') print(img2)

#如何解决“读到的图片不存在的问题”? #加入判断语句,如果为空,做异常处理 img2 = cv2.imread('2.jpg') if img2 == None: print('fail to load image!')

图片矩阵变换

opencv读入图片的矩阵格式是:(height,width,channels)。而在深度学习中,因为要对不同通道应用卷积,所以会采取另一种方式:(channels,height,width)。为了应对该要求,我们可以这么做

#注意到,opencv读入的图片的彩色图是一个channel last的三维矩阵(h,w,c),即(高度,宽度,通道) #有时候在深度学习中用到的的图片矩阵形式可能是channel first,那我们可以这样转一下 print(img.shape) img = img.transpose(2,0,1) print(img.shape)

在深度学习搭建CNN时,往往要做相应的图像数据处理,比如图像要扩展维度,比如扩展成(batch_size,channels,height,width)。

对于这种要求,我们可以这么做。

#有时候还要扩展维度,比如有时候我们需要预测单张图片,要在要加一列做图片的个数,可以这么做 img = np.expand_dims(img, axis=0) print(img.shape)

上面提到的是预测阶段时预测单张图片的扩展维度的操作,如果是训练阶段,构建batch,即得到这种形式:(batch_size,channels,height,width)。我一般喜欢这么做

data_list = [] loop: im = cv2.imread('xxx.png') data_list.append(im) data_arr = np.array(data_list)

这样子就能构造成我们想要的形式了。

图片归一化 #因为opencv读入的图片矩阵数值是0到255,有时我们需要对其进行归一化为0~1 img3 = cv2.imread('1.jpg') img3 = img3.astype("float") / 255.0 #注意需要先转化数据类型为float print(img3.dtype) print(img3)

Python各类图像库的图片读写方式总结

存储图片 #存储图片 cv2.imwrite('test1.jpg',img3) #得到的是全黑的图片,因为我们把它归一化了 #所以要得到可视化的图,需要先*255还原 img3 = img3 * 255 cv2.imwrite('test2.jpg',img3) #这样就可以看到彩色原图了 opencv大坑之BGR

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/d043288479101f8ef2eeb1b80079b7ae.html