【轉(zhuǎn)載】python+opencv解決方案:保存圖像的方法比較之一

https://blog.csdn.net/LiuKejiaHAX/article/details/80711208


學(xué)習(xí)各種圖片讀入和保存方法,分析對比其圖像的格式

1.cv2打開和保存圖片:分彩色和灰度圖兩種情況

? ? (1)讀入指令為cv2.imread('house.jpg'),cv2.imread('house.jpg',cv2.IMREAD_GRAYSCALE)

? ? (2)讀入圖像為nd.array格式矩陣,注意顏色頻道BGR的順序,

? ? (3)保存指令為cv2.imwrite('imgsavename.*',imgname)。

? ? ? 如果顯示圖像時(shí)做了BGR2RGB,則在保存前應(yīng)該做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()轉(zhuǎn)換為array格式的矩陣,

? ? (4)保存時(shí)再用Image.fromarray()轉(zhuǎn)換回圖像<PIL.Image.Image image mode=RGB size=280x200,

? ? ? dtype為None

? ? (5)保存指令為imgname.save('imgsavename.*')。

3.skimage打開和保存圖片:分彩色和灰度圖兩種情況

? ? (1)讀入彩色圖像指令為 io.imread('house.jpg'),

? ? ? 讀入圖片的數(shù)據(jù)格式為uint8,三通道RGB格式,與cv2同

? ? (2)讀入灰度圖像指令為io.imread('house.jpg',as_grey=True),

? ? ? 讀入圖片的數(shù)據(jù)格式為float,數(shù)值在0到1之間

4.plt打開和保存圖片:

? ? (1)讀入指令為plt.imread(),

? ? (2)保存指令為plt.savefig('imgsavename.*'),且一定在plt.show()之前;

? ? ? plt.savefig將當(dāng)前窗口內(nèi)的內(nèi)容保存,包括白邊(有無參數(shù)設(shè)置為不保存白邊?)。

5.實(shí)驗(yàn)結(jié)果:? ?

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

總結(jié):

? ? (1)讀入彩圖cv2,plt,ski數(shù)據(jù)類型為uint8一致,均為三通道uint8(注意cv2是BGR);

? ? ? pil讀入JPEG格式(mode=RGB)且shape不同,需要轉(zhuǎn)換為ndarray(shape變化),

? ? ? 保存時(shí)再轉(zhuǎn)回圖片,格式為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)? ? ? ? ? ? # 圖像占內(nèi)存略大于原圖

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讀入和保存彩色圖,并進(jìn)行格式轉(zhuǎn)換以用于不同目的

img_pil = Image.open('house.jpg')? ? ? ? ? ? ? ? ? ? ? # img類,JPEG格式,mode=RGB

img_pil2arr = np.array(img_pil)? ? ? ? ? ? ? ? ? ? ? ? # 轉(zhuǎn)成ndarray

img_arr2pil = Image.fromarray(img_pil2arr)? ? ? ? ? ? ? # 矩陣再轉(zhuǎn)為圖像

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:將當(dāng)前窗口內(nèi)的內(nèi)容保存,包括白邊

'''

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')

'''

打印圖片格式

'''

#? 分類顯示:方法結(jié)果對比

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))

#? 分類顯示:相同操作結(jié)果對比

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打開原始彩色圖像進(jìn)行顯示? ?

ax.set_title('Source image')

ax = fig.add_subplot(243)

ax.imshow(img_cv2write)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # 打開cv2保存的彩色圖像進(jìn)行顯示? ?

ax.set_title('cv2write image')? ? ? ? ? ?

ax = fig.add_subplot(247)

ax.imshow(imgray_cv2write)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # 打開cv2保存的灰度圖像進(jìn)行顯示

ax.set_title('cv2write gray image')

ax = fig.add_subplot(244)

ax.imshow(img_skisave)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # 打開ski保存的彩色圖像進(jìn)行顯示

ax.set_title('skisave image')

ax = fig.add_subplot(248)

ax.imshow(imgray_skisave)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # 打開ski保存的灰度圖像進(jìn)行顯示

ax.set_title('skisave gray image')

ax = fig.add_subplot(242)

ax.imshow(img_pilsave)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # 打開pil保存的彩色圖像進(jìn)行顯示

ax.set_title('pilsave image')

ax = fig.add_subplot(246)

ax.imshow(imgray_pilsave)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # 打開pil保存的灰度圖像進(jìn)行顯示

ax.set_title('pilsave gray image')

ax = fig.add_subplot(245)

ax.imshow(img_pltsave)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # 打開plt保存的彩色圖像進(jìn)行顯示

ax.set_title('pltsave image')

plt.savefig('house_save_img_method_compare.jpg')


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容