python画像の読み書きのいくつかの方法、PIL、imageio、pylibtiff

3029 ワード

scikit-imageは豊富な画像の読み書き、処理操作を提供します
リファレンス
【Tensorflow】アシストツール編——scikit-image紹介
読み書き浮動小数点TIFF画像を直接サポート
from skimage import io

img = io.imread('testimg.tif')


import numpy as np

data=np.random.random([100,100])

io.imsave('rand_data.tif',np.float32(data))


 
pillow/PELライブラリ
https://pillow.readthedocs.io/en/5.1.x/index.html
imageioライブラリ
http://imageio.readthedocs.io/en/latest/index.html
http://imageio.github.io/
pillowとimageioを組み合わせて私のテストの例を示します
 
import numpy as np
import imageio
from PIL import Image #PIL pakage name is Pillow 


img=imageio.imread(r'G:\leopard.jpg')
high,width,ichannel=img.shape
print(type(img))
print(img.shape)
imageio.imwrite(r'G:\leopard_i1.jpg',img)
imageio.imwrite(r'G:\leopard_i2.jpg',np.float32(img/10)) # automatic brightness adjust
imageio.imwrite(r'G:\leopard_i3.jpg',np.uint8(img/10))


im = Image.open(r'G:\leopard.jpg')
print(type(im)) 
in_data = np.asarray(im, dtype=np.uint8)
print(type(in_data))
print(in_data.shape) 


new_im = Image.fromarray(in_data) # np.uint8, or TypeError: Cannot handle this data type

# new_im.show()
new_im.save(r'G:\leopard_p1.jpg')

奇妙な現象を発見しました
1,RGBの3チャネルの階調値が特に似ている場合,jpgとして保存すると自動的に1チャネルのみの階調図となる.pngとbmpに保存するとこの問題はありません
2,imageio浮動小数点画像は自動的に明るさが調整され、手動でuint 8に変換しても問題ありません
 
MATLAB matファイルの読み書き
import scipy.io as sio

# load mean and std

matfile = sio.loadmat(meanstd_file)

test_mean = np.array(matfile['mean_test'])

test_std = np.array(matfile['std_test'])



# Save predictions to a matfile to open later in matlab

mdict = {"Recovery": Recovery}

sio.savemat(savename, mdict)

io.imsave('Recovery.tif', np.float32(Recovery))

 
TIFFイメージ、pylibtiffライブラリ
https://github.com/pearu/pylibtiff
Usage example (libtiff wrapper)
from libtiff import TIFF

# to open a tiff file for reading:

tif = TIFF.open('filename.tif', mode='r')

# to read an image in the currect TIFFdirectory and return it as numpy array:

image = tif.read_image()

# to read all images in a TIFF file:

for image in tif.iter_images(): # do stuffwith image

 

# to open a tiff file for writing:

tif = TIFF.open('filename.tif', mode='w')

# to write a image to tiff file

tif.write_image(image)

Usage example (pure Python module)
from libtiff import TIFFfile, TIFFimage

# to open a tiff file for reading

tif = TIFFfile('filename.tif')

# to return memmaps of images and sample names (eg channel names,SamplesPerPixel>=1)

samples, sample_names = tiff.get_samples()

 

# to create a tiff structure from image data

tiff = TIFFimage(data, description='')

# to write tiff structure to file

tiff.write_file('filename.tif', compression='none') # or 'lzw'

del tiff # flushes data to disk