Python OpenCV 画像の読み込み・保存 imread・imwrite

OpenCV

PythonのOpenCVで画像ファイルを読み込み、保存する方法を紹介します。

ここではcv2.imread()cv2.imwrite()を使い、画像ファイルをNumPy配列のndarrayとして読み込み、ndarrayを画像ファイルとして保存します。

また、カラー画像とモノクロ画像で取り扱いが異なるので分けて説明します。

関数と主な引数

cv2.imread(path, flags=cv2.IMREAD_COLOR)

path画像ファイルのパス、文字列
flags画像ファイルの読み込み方法、デフォルトはカラー読み込み
<引数一例>
 cv2.IMREAD_COLOR: カラーで読み込み
 cv2.IMREAD_GRAYSCALE: モノクロで読み込み

cv2.imwrite(filename, image)

filename出力する画像のファイル名、.jpg, .pngなどのファイル形式を含めて指定する
image出力する画像データ、ndarrayなど

カラー画像で読み込み・保存

cv2.imread()で画像ファイルから読み込み

こちらの風景写真を例に、読み込み・保存を行う。

以下のように、カラー画像を読み込むと、高さ x 幅 x 色(チャネル) の3次元のndarrayが返される。これをmatplotlibで表示しようとすると、色彩が異なっている。これは、OpenCVが色(チャネル)をBGRの順でndarrayに読み込んでいる一方で、matplotlibはRGBの順のndarrayを想定しているからである。

Code:

import cv2
import matplotlib.pyplot as plt

# pathを設定
path = './pic/landscape.jpg'
  
# カラー画像として読み込み
img = cv2.imread(path)

# 型を確認
print(f'type: {type(img)}')

# 次元を確認
print(f'shape: {img.shape}')
  
# 読み込んだ画像を表示
plt.imshow(img)
plt.show()

Output:

type: <class 'numpy.ndarray'>
shape: (600, 800, 3)

cv2.cvtColor()メソッドで第二引数にcv2.COLOR_BGR2RGBを指定することで、BGR→RGBに変換することができる。

Code:

plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()

Output:

cv2.imwrite()で画像ファイルを保存

cv2.imwrite()による保存は簡単で、以下のとおりである。

Code:

cv2.imwrite('./pic/landscape.png', img)

モノクロ画像で読み込み・保存

cv2.imread()で画像ファイルから読み込み

続いて、先ほどの風景写真をモノクロ画像として読み込むと、高さ x 幅 の2次元のndarrayが返される。ここでは、cv2.imread()の第二引数にcv2.IMREAD_GRAYSCALEを指定している。matplotlibでの表示の際も、plt.imshow()の引数にcmap=plt.cm.grayを指定して、モノクロ画像として表示している。これらの結果は、モノクロの画像ファイルを読み込んだ場合も同様となる。

Code:

import cv2
import matplotlib.pyplot as plt

# pathを設定
path = './pic/landscape.jpg'
  
# モノクロ画像として読み込み
img_gray = cv2.imread(path,cv2.IMREAD_GRAYSCALE)

# 型を確認
print(f'type: {type(img_gray)}')

# 次元を確認
print(f'shape: {img_gray.shape}')
  
# 読み込んだ画像を表示
plt.imshow(img_gray,cmap=plt.cm.gray)
plt.show()

Output:

type: <class 'numpy.ndarray'>
shape: (600, 800)

cv2.imwrite()で画像ファイルを保存

cv2.imwrite()による保存は簡単で、以下のとおりである。

Code:

cv2.imwrite('./pic/landscape_gray.png', img_gray)

コメント

タイトルとURLをコピーしました