方法一:利用PIL中的Image函数,这个函数读取出来不是array格式
这时候需要用 np.asarray(im) 或者np.array() 函数
区别是 np.array() 是深拷贝,np.asarray() 是浅拷贝
from PIL import Image
import numpy as np
I = Image.open('./cc_1.png')
I.show()
I.save('./save.png')
I_array = np.array(I)
print I_array.shape
print(type(img)) #显示类型
print(img.shape) #显示尺寸
print(img.shape[0]) #图片宽度
print(img.shape[1]) #图片高度
print(img.shape[2]) #图片通道数
print(img.size) #显示总像素个数
print(img.max()) #最大像素值
print(img.min()) #最小像素值
print(img.mean()) #像素平均值
方法二:利用matplotlib.pyplot as plt
用于显示图片
matplotlib.image as mpimg
用于读取图片
并且读取出来就是array格式
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
I = mpimg.imread('./cc_1.png')
print I.shape
plt.imshow(I)
方法三:利用opencv-python接口
OpenCV目前支持读取bmp、jpg、png、tiff等常用格式
cv2.imread()读出来同样是array形式,但是如果是单通道的图,读出来的是三通道的
import cv2
img = cv2.imread('/data/person.png') #参数中填入图片的完全路径或者相对路径
cv2.namedWindow('image', cv2.WINDOW_NORMAL) # 给显示的窗口命名,后面的flag默认为
cv2.WINDOW_AUTOSIZE,自动调整边框,但是在条形图过长时,使用windownormal我们可以
自行调整边框
cv2.imshow('image',img) # 展示图片
cv2.waitKey(0) # 等待按键按下,如果不添最后一句,在IDLE中执行窗口直接无响应。
在命令行中执行的话,则是一闪而过。
cv2.destroyAllWindows() # 清除所有窗口
print(img.shape)
我们可以使用imwrite来存储一张图片,接受一个numpy的数组作为参数.
cv2.imwrite('cope_lenna_img.jpg',img)
#result: True
他会返回一个bool值来表示它是否成功存储.
我们成功在当前目录存储了一个叫做copy_lenna_img.jpg的图像.
这里我们需要稍微了解下flag这个参数,这决定了opencv是如何读入我们的图像的
我们知道通常图像每个像素点的颜色我们以RGB的格式来描述(或者RGBA),可以通过三基色(red,green,blue)来描述所有颜色,对于透明图片我们会增加一个a(alpha)来描述其颜色的透明度.
cv2.IMREAD_COLOR : 读入图片,任何与透明度相关通道的会被忽视,默认以这种方式读入.
cv2.IMREAD_GRAYSCALE : 以灰度图的形式读入图片.
cv2.IMREAD_UNCHANGED : 保留读取图片原有的颜色通道.
可以简单的用-1,0,1来分别表示这3个flag
举例如下:
在开头引入必要的库
import matplotlib.pyplot as plt
import numpy as np
import cv2
#ipython %matplotlib inline
gray_lenna_img = cv2.imread("lena.jpg",0)
orign_lenna_img=cv2.imread("lena.jpg",1)
plt.subplot(121)
plt.imshow(gray_lenna_img,cmap=plt.cm.gray)
plt.axis("off")
plt.subplot(122)
orign_lenna_img = cv2.cvtColor(orign_lenna_img,cv2.COLOR_BGR2RGB)
plt.imshow(orign_lenna_img)
plt.axis("off")
plt.show()
因为lenna图并没有包含透明度这一通道,读入的仍然是BGR格式,所以我们从lenna图是看不出区别的
读取和显示图像(使用opencv,该部分以定义一个函数的形式读取图像)
#读取和显示图像
def showimg(imagePath):
img = cv2.imread(imagePath) #读取本地图片,目前OpevCV支持bmp、jpg、png、tiff
cv2.namedWindow("Image") #创建一个窗口用来显示图片
cv2.imshow("Image", img) #显示图片
cv2.waitKey (0) #等待输入,这里主要让图片持续显示。
cv2.destroyAllWindows() #释放窗口
if __name__ == '__main__':
imagePath = '/data/person.jpg'
showimg(imagePath)
第一个参数是保存文件名和路径,第二个是图像矩阵。imwrite() 有个可选的第三个参数
cv2.imwrite("/data/person_test.jpg",img,int(cv2.IMWRITE_JPEG_QUALITY),5])
5 – 是第三个参数,它针对特定的格式:对于JPEG,其表示的是图像的质量,用0 - 100的整数表示,默认95
注意: cv2.IMWRITE_JPEG_QUALITY类型为 long ,必须转换成 int.,对于png ,第三个参数表示的是压缩级别。cv2.IMWRITE_PNG_COMPRESSION
, 从0到9 压缩级别越高图像越小。默认为3.
方法四:图像的存取
我一般喜欢用scipy这个库里的东西,读出来是矩阵形式,并且按照(H,W,C)形式保存(行,列,通道)
import matplotlib.pyplot as plt
from scipy import misc
import scipy
I = misc.imread('./cc_1.png')
scipy.misc.imsave('./save1.png', I)
plt.imshow(I)
plt.show()
方法五:用skimage库
from skimage import io,data
img=data.lena() # 详细解释如下,使用data可以直接调用skimage程序中自带的图像
io.imread('/data/person.png',as_grey=True) # 读取制定路径下的图像,第一个参数为图片路
径,第二个参数为as_grey, bool型值,默认为False
io.imshow(img)
skimage程序自带了一些示例图片,如果我们不想从外部读取图片,就可以直接使用这些示例图片,图片名对应的就是函数名,如camera图片对应的函数名为camera(). 这些示例图片存放在skimage的安装目录下面,路径名称为data_dir,我们可以将这个路径打印出来看看:
from skimage import data_dir
print(data_dir)
输出:
/usr/lib/python3/dist-packages/skimage/data
下面两段代码输出的结果是一样的
from skimage import data_dir,data,io
img1=data.lena() #读取lena图片
img2=io.imread(data_dir+'/lena.png') #读取lena图片
自带图片函数名汇总
函数名 | 内容 |
astronaut | 宇航员图片 |
coffee | 一杯咖啡图片 |
lena | lena美女图片 |
camera | 拿相机的人图片 |
coins | 硬币图片 |
moon | 月亮图片 |
checkerboard | 棋盘图片 |
horse | 马图片 |
page | 书页图片 |
chelsea | 小猫图片 |
hubble_deep_field | 星空图片 |
text | 文字图片 |
clock | 时钟图片 |
immunohistochemistry | 结肠图片 |