python+opencv保存图像三种方法比较

学习各种图片读入和保存方法,分析对比其图像的格式

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()转换回图像<PIL.Image.Image image mode=RGB size=280x200, dtype为None
         ~~~~~~~~         (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
6.总结

        ~~~~~~~         (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改变。

7.代码
'''
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)                                          # <PIL.JpegImagePlugin.JpegImageFile image mode=RGB...
print(img_arr2pil.format)
print(img_arr2pil.size)
print(img_arr2pil)
#   用PIL读入和保存灰度图
imgray_pil = Image.open('house.jpg').convert('L')       # L为灰度图,RGB为真彩色,RGBA为加了透明频道
imgray_pil.save('house_gray_pilsave.jpg')
print(imgray_pil.format)                                # None;format为None,mode为L,注意与彩色图不同 
print(imgray_pil.size)                                  # (280, 200)
print(imgray_pil)                                       # <PIL.Image.Image image mode=L size=280x200 at...
imgray_pilsave = plt.imread('house_gray_pilsave.jpg')

'''
3.skimage保存:分彩色和灰度图两种情况
'''
from skimage import io
#   ski读入彩色图
img_ski = io.imread('house.jpg') 
io.imshow(img_ski)                                      # io.imshow显示图像
io.imsave('house_skisave.jpg',img_ski)                  # io.save保存图像
img_skisave = plt.imread('house_skisave.jpg')           # plt读入图像
print(img_ski.dtype)
print(img_ski.size)
print(img_ski.shape)
print(img_ski)
#   ski读入灰度图
imgray_ski = io.imread('house.jpg',as_grey=True) 
print(imgray_ski.dtype)
print(imgray_ski.size)
print(imgray_ski.shape)
print(imgray_ski)
io.imsave('house_gray_ski.jpg',imgray_ski)
imgray_skisave = plt.imread('house_gray_ski.jpg')

'''
4.plt.save:将当前窗口内的内容保存,包括白边
'''
import matplotlib.pyplot as plt
fig = plt.figure('house')
img_plt = plt.imread('house.jpg')
plt.imshow(img_plt)
plt.savefig('house_pltsave.jpg')                        # 一定在plt.show()之前
plt.show()
img_pltsave = plt.imread('house_pltsave.jpg')


'''
打印图片格式
'''
#   分类显示:方法结果对比
print("cv2 open and cvtBGR  (shape,dtype):{},{}".format(img_cv2RGB.shape,img_cv2RGB.dtype))
print("cv2 open and save    (shape,dtype):{},{}".format(img_cv2write.shape,img_cv2write.dtype))
print("cv2 open gray        (shape,dtype):{},{}".format(imgray_cv2.shape,imgray_cv2.dtype))
print("cv2 open and savegray(shape,dtype):{},{}".format(imgray_cv2write.shape,imgray_cv2write.dtype))
print("pil open gray        (size ,dtype):{},{}".format(imgray_pil.size,imgray_pil.format))
print("pil open and savegray(shape,dtype):{},{}".format(imgray_pilsave.shape,imgray_pilsave.dtype))
print("pil open             (size ,dtype):{},{}".format(img_pil.size,img_pil.format))
print("pil open and pil2arr (shape,dtype):{},{}".format(img_pil2arr.shape,img_pil2arr.dtype))
print("pil open and arr2pil (size ,dtype):{},{}".format(img_arr2pil.size,img_arr2pil.format))
print("pil open and save    (shape,dtype):{},{}".format(img_pilsave.shape,img_pilsave.dtype))
print("ski open             (shape,dtype):{},{}".format(img_ski.shape,img_ski.dtype))
print("ski open and save    (shape,dtype):{},{}".format(img_skisave.shape,img_skisave.dtype))
print("ski open gray        (shape,dtype):{},{}".format(imgray_ski.shape,imgray_ski.dtype))
print("ski open and savegray(shape,dtype):{},{}".format(imgray_skisave.shape,imgray_skisave.dtype))
print("plt open             (shape,dtype):{},{}".format(img_plt.shape,img_plt.dtype))
print("plt open and save    (shape,dtype):{},{}".format(img_pltsave.shape,img_pltsave.dtype))
#   分类显示:相同操作结果对比
print("cv2 open and cvtBGR  (shape,dtype):{},{}".format(img_cv2RGB.shape,img_cv2RGB.dtype))
print("ski open             (shape,dtype):{},{}".format(img_ski.shape,img_ski.dtype))
print("plt open             (shape,dtype):{},{}".format(img_plt.shape,img_plt.dtype))
print("pil open             (size ,dtype):{},{}".format(img_pil.size,img_pil.format))
print("pil open and pil2arr (shape,dtype):{},{}".format(img_pil2arr.shape,img_pil2arr.dtype))
print("pil open and arr2pil (size ,dtype):{},{}".format(img_arr2pil.size,img_arr2pil.format))
print("cv2 open and save    (shape,dtype):{},{}".format(img_cv2write.shape,img_cv2write.dtype))
print("pil open and save    (shape,dtype):{},{}".format(img_pilsave.shape,img_pilsave.dtype))
print("ski open and save    (shape,dtype):{},{}".format(img_skisave.shape,img_skisave.dtype))
print("plt open and save    (shape,dtype):{},{}".format(img_pltsave.shape,img_pltsave.dtype))
print("cv2 open gray        (shape,dtype):{},{}".format(imgray_cv2.shape,imgray_cv2.dtype))
print("pil open gray        (size ,dtype):{},{}".format(imgray_pil.size,imgray_pil.format))
print("ski open gray        (shape,dtype):{},{}".format(imgray_ski.shape,imgray_ski.dtype))
print("cv2 open and savegray(shape,dtype):{},{}".format(imgray_cv2write.shape,imgray_cv2write.dtype))
print("pil open and savegray(shape,dtype):{},{}".format(imgray_pilsave.shape,imgray_pilsave.dtype))
print("ski open and savegray(shape,dtype):{},{}".format(imgray_skisave.shape,imgray_skisave.dtype))


'''
显示图像
'''
fig = plt.figure(figsize=(20,10))
plt.axis('off')
ax = fig.add_subplot(241)
ax.imshow(img_cv2RGB)                                   # 用cv2打开原始彩色图像进行显示    
ax.set_title('Source image')
ax = fig.add_subplot(243)
ax.imshow(img_cv2write)                                 # 打开cv2保存的彩色图像进行显示    
ax.set_title('cv2write image')            
ax = fig.add_subplot(247)
ax.imshow(imgray_cv2write)                              # 打开cv2保存的灰度图像进行显示 
ax.set_title('cv2write gray image')
ax = fig.add_subplot(244)
ax.imshow(img_skisave)                                  # 打开ski保存的彩色图像进行显示
ax.set_title('skisave image') 
ax = fig.add_subplot(248)
ax.imshow(imgray_skisave)                               # 打开ski保存的灰度图像进行显示 
ax.set_title('skisave gray image')
ax = fig.add_subplot(242)
ax.imshow(img_pilsave)                                  # 打开pil保存的彩色图像进行显示 
ax.set_title('pilsave image')
ax = fig.add_subplot(246)
ax.imshow(imgray_pilsave)                               # 打开pil保存的灰度图像进行显示 
ax.set_title('pilsave gray image')
ax = fig.add_subplot(245)
ax.imshow(img_pltsave)                                  # 打开plt保存的彩色图像进行显示 
ax.set_title('pltsave image')
plt.savefig('house_save_img_method_compare.jpg')


参考:https://www.e-learn.cn/content/python/781254

  • 8
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值