作成日:20210201
言語:Python
Pythonでの画像読み込みについて、skimage.io.imread関数とcv2.imread関数を調べた。
※Pythonの画像処理ライブラリには他にPillow(PIL)もありますが、この記事では触れていません。
##1. 参考リンク
1-1. scikit-imageでの画像読み込み (skimage.io.imread)
scikit-image公式ドキュメント
https://scikit-image.org/docs/dev/api/skimage.html
(ページ中程のUtility Functionsに画像読み込み関数のまとめあり。)
1-2. OpenCVでの画像読み込み (cv2.imread)
note.nkmk.me Python -- OpenCVで画像ファイルの読み込み、保存(imread, imwrite)
https://note.nkmk.me/python-opencv-imread-imwrite/
##2. scikit-image
2-1. 概要
読み込みはskimage.io.imread
データ型の変換は、
img_as_float
(0~1までの浮動小数点数)、
img_as_uint
(0~65535の整数=16ビット型)、
img_as_ubyte
(0~255の整数=8ビット型)。
2-2. 注意 (自分用メモ)
今までskimageの画像読み込み・データ変換関数をよく知らずに、0~1に正規化する際にnp.float64((io.imread(fname))/255
などという書き方をしていたが、今後は避ける。この書き方だと bit depth を確認して正規化しないといけない(8-bitなら255、16-bitなら65535で割る)。それよりも、最初から img_as_float
を使った方が良い。
2-3. サンプルコード
import numpy as np
import matplotlib.pyplot as plt
from skimage import io,img_as_float, img_as_uint, img_as_ubyte
#
# Import test images
#
fname = '../test.tif'
### 画像のデータ型そのまま
print('raw image')
img = io.imread(fname)
## 画像情報
print(img.shape) # 画像の大きさ
print(img) # 画像が数値配列として表示される
print(type(img)) # numpy.ndarray
print(img.dtype) # これでbit depth を取得できる (今回は uint8 型でした)
## plot
plt.figure()
plt.imshow(img, cmap='gray')
plt.show()
### 0-1の浮動小数点型にする
print('img_as_float')
img_float = img_as_float(io.imread(fname))
# 【注意】
# np.float64((io.imread(fname))/255 という書き方は今後は避ける。
# これだと bit depth を確認して正規化しないといけない。8-bitなら255、16-bitなら65535で正規化しないといけない。
# 最初から img_as_float を使った方が良い。
print(img_float)
## plot
plt.figure()
plt.imshow(img_float, cmap='gray')
plt.show()
### 16-bit型、8-bit型にする
print('img_as_uint')
img_16bit = img_as_uint(io.imread(fname))
# img_8bit = img_as_ubyte(io.imread(fname))
print(img_uint)
print(img_uint.dtype)
3. OpenCV
3-1. 概要
画像の読み込みはcv2.imread
。
3-2. 注意 (自分用メモ)
openCVのcv2.imread関数はerrorを出さないので、読み込めなかった時のトラブルシューティングがちょっと面倒くさい(参考URL: https://note.nkmk.me/python-opencv-imread-imwrite/ )。
3-3. サンプルコード
import numpy as np
import matplotlib.pyplot as plt
import cv2
#
# Import test images
#
img_file='../test.tif'
img = cv2.imread( img_file, 0 )
print(img)
print(img.shape) # 画像の大きさ
print(type(img)) # <class 'numpy.ndarray'>
print(img.dtype) # uint8
# 【注意】
# openCVのcv2.imread関数はerrorを出さないので、読み込めなかった時のトラブルシューティングがちょっと面倒くさい
# 参考URL: https://note.nkmk.me/python-opencv-imread-imwrite/
plt.figure()
plt.imshow(img, cmap='gray')
plt.show()
__終わり__