学习各种图片读入和保存方法,分析对比其图像的格式
1.cv2打开和保存图片:分彩色和灰度图两种情况
(1)读入指令为cv2.imread('house.jpg'),cv2.imread('house.jpg',cv2.IMREAD_GRAYSCALE)
(2)读入图像为nd.array格式矩阵,注意颜色频道BGR的顺序,
(3)保存指令为cv2.imwrite('imgsavename.*',imgname)。
如果显示图像时做了BGR2RGB,则在保存前应该做RGB2BGR,否则存的图频道颠倒。
2.PIL打开和保存图片:
(1)打开文件指令为Image.open('house.jpg'),Image.open('house.jpg').convert('L')
(2)打开后图像格式为PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=280x200,
dtype为JPEG,mode为RGB;灰度图则分别为None和mode=L;
(3)需要使用nd.array()转换为array格式的矩阵,
(4)保存时再用Image.fromarray()转换回图像
(5)保存指令为imgname.save('imgsavename.*')。
3.skimage打开和保存图片:分彩色和灰度图两种情况
(1)读入彩色图像指令为 io.imread('house.jpg'),
读入图片的数据格式为uint8,三通道RGB格式,与cv2同
(2)读入灰度图像指令为io.imread('house.jpg',as_grey=True),
读入图片的数据格式为float,数值在0到1之间
4.plt打开和保存图片:
(1)读入指令为plt.imread(),
(2)保存指令为plt.savefig('imgsavename.*'),且一定在plt.show()之前;
plt.savefig将当前窗口内的内容保存,包括白边(有无参数设置为不保存白边?)。
5.实验结果:
cv2 open and cvtBGR (shape,dtype):(200, 280, 3),uint8
ski open (shape,dtype):(200, 280, 3),uint8
plt open (shape,dtype):(200, 280, 3),uint8
pil open (size ,dtype):(280, 200),JPEG
pil open and pil2arr (shape,dtype):(200, 280, 3),uint8
pil open and arr2pil (size ,dtype):(280, 200),None
cv2 open and save (shape,dtype):(200, 280, 3),uint8
pil open and save (shape,dtype):(200, 280, 3),uint8
ski open and save (shape,dtype):(200, 280, 3),uint8
plt open and save (shape,dtype):(288, 432, 3),uint8
cv2 open gray (shape,dtype):(200, 280),uint8
pil open gray (size ,dtype):(280, 200),None
ski open gray (shape,dtype):(200, 280),float64
cv2 open and savegray(shape,dtype):(200, 280),uint8
pil open and savegray(shape,dtype):(200, 280),uint8
ski open and savegray(shape,dtype):(200, 280),uint8
总结:
(1)读入彩图cv2,plt,ski数据类型为uint8一致,均为三通道uint8(注意cv2是BGR);
pil读入JPEG格式(mode=RGB)且shape不同,需要转换为ndarray(shape变化),
保存时再转回图片,格式为None(shape变化)。
(2)读入灰度图仅对比了cv2,ski和pil,三者均不同,cv2为uint8,而ski为float64(0和1之间),
pil的format为None(mode=L),与彩色图同操作。
(3)保存图片,四种方法均为uint8,但是cv2,pil,ski保存原图shape不变
(注意cv2又存成BGR),而plt保存窗口且shape改变。
'''
1.cv2打开图片,显示后,用cv2存储
'''
import cv2
import matplotlib.pyplot as plt
# cv2读入和保存彩色图
img_cv2BGR = cv2.imread('house.jpg')
img_cv2RGB = cv2.cvtColor(img_cv2BGR,cv2.COLOR_BGR2RGB)
cv2.imwrite('house_cv2write.jpg',img_cv2RGB) # 图像占内存略大于原图
img_cv2write = plt.imread('house_cv2write.jpg')
print(img_cv2BGR.dtype)
print(img_cv2BGR.size)
print(img_cv2BGR.shape)
print(img_cv2BGR)
# cv2读入和保存灰度图
imgray_cv2 = cv2.imread('house.jpg',cv2.IMREAD_GRAYSCALE)
cv2.imwrite('housegray_cv2write.jpg',imgray_cv2)
imgray_cv2write = plt.imread('housegray_cv2write.jpg')
print(imgray_cv2.dtype)
print(imgray_cv2.size)
print(imgray_cv2.shape)
print(imgray_cv2)
'''2.PIL保存'''
from PIL import Image
import numpy as np
# 用PIL读入和保存彩色图,并进行格式转换以用于不同目的
img_pil = Image.open('house.jpg') # img类,JPEG格式,mode=RGB
img_pil2arr = np.array(img_pil) # 转成ndarray
img_arr2pil = Image.fromarray(img_pil2arr) # 矩阵再转为图像
img_arr2pil.save('house_pilsave.jpg') # PIL保存图像
img_pilsave = plt.imread('house_pilsave.jpg')
print(img_pil.format) # JPEG; 'Image' object has no attribute 'shape' and 'dtype'
print(img_pil.size) # (280, 200)
print(img_pil) #
代码参考了《
Python
各类图像库的图片读写方式总结
》(
http://www.cnblogs.com/skyfsm/p/8276501.html
),和叶韵的《深度学习与计算机视觉》,做了一些增删和改进。