はじめに
※2023年1月14日に公開した記事ですが、加筆・修正して2024年1月3日に再度公開しました。
PythonでOpenCVを使った画像の読み込みについて紹介します。
OpenCVで画像を読み込むためのcv2.imread
関数はさまざまな画像フォーマットを読み込むことができます。また、アルファチャンネルを含む画像の読み込みにも対応しています。
画像の読み込み
画像の読み込みはcv2.imread
関数を使います。
これらの画像フォーマットの読み込みに対応しています。
- Windowsビットマップ:*.bmp, *.dib
- JPEG:*.jpeg, *.jpg, *.jpe
- JEPG2000:*.jp2
- PNG:*.png
- WebP:*.webp
- ポータブル イメージ フォーマット:.pbm, *.pgm, *.ppm *.pxm, *.pnm
- PFMファイル:*.pfm
- Sun rasters:*.sr, *.ras
- TIFFファイル:*.tiff, *.tif
- OpenEXR イメージ ファアイル:*.exr
- Radiance(ラディエンス) HDR:*.hdr, *.pic
cv2.imread
関数は、ファイルの拡張子ではなく、読み込んだデータで画像の種類を特定しています。
読み込まれたデータの各画素はGBRの順番となっています。
cv2.imread関数
2つの引数が用意されていて、戻り値に画像データが格納されます。
引数
名称 | 説明 |
ファイル名(必須) | 読み込む画像のファイル名 |
imreadフラグ(オプション) | ImreadModes として定義されているフラグ |
戻り値
読み込んだ画像データ(ndarray)
解説
引数のImreadModes
は以下の様に定義されています。
ImreadModes
モード | 説明 |
cv2.IMREAD_UNCHANGED |
画像を色や精度などをそのままの状態で読み込みます。アルファチャネルを持つ画像も読み込むことができます。EXIFは読み込まれません。 |
cv2.IMREAD_GRAYSCALE | グレースケールに変換して読み込みます。 |
cv2.IMREAD_COLOR | 3チャンネルのBGRカラーイメージに変換して読み込みます。 |
cv2.IMREAD_ANYDEPTH | 画素のビット深度が8bit/16bit/32bitのいずれかに自動判定されて読み込みます。 |
cv2.IMREAD_ANYCOLOR | 画像の読み込みは任意のカラー フォーマットで実行されます。 |
cv2.IMREAD_LOAD_GDAL | GDALドライバーを使用して読み込まれます。 |
cv2.IMREAD_REDUCED_GRAYSCALE_2 | グレースケールに変換され、1/2のサイズに縮小されて読み込まれます。 |
cv2.IMREAD_REDUCED_COLOR_2 | 3チャンネルのBGRカラーイメージに変換され、、1/2のサイズに縮小されて読み込まれます。 |
cv2.IMREAD_REDUCED_GRAYSCALE_4 | グレースケールに変換され、1/4のサイズに縮小されて読み込まれます。 |
cv2.IMREAD_REDUCED_COLOR_4 | 3チャンネルのBGRカラーイメージに変換され、、1/4のサイズに縮小されて読み込まれます。 |
cv2.IMREAD_REDUCED_GRAYSCALE_8 | グレースケールに変換され、1/8のサイズに縮小されて読み込まれます。 |
cv2.IMREAD_REDUCED_COLOR_8 | 3チャンネルのBGRカラーイメージに変換され、、1/8のサイズに縮小されて読み込まれます。 |
cv2.IMREAD_IGNORE_ORIENTATION | EXIF画像方向を無視し、回転せずに画像を読み込みます。 |
使い方
フラグなしで画像を読み込み
import cv2 # ImreadModesの指定なしで画像を読み込む image = cv2.imread("image.jpg")
グレースケールで画像を読み込み
import cv2 # グレースケールで画像を読み込む image = cv2.imread("image.jpg", cv2.IMREAD_GRAYSCALE)
画像が読み込めないとき
指定した画像ファイルのパスを間違えてしまった場合、imreadは"None"を返します。エラーは出ないので注意してください。
画像が読み込まれたか確認するコード
画像が読み込まれたかどうかは次のコードで確認できます。
import cv2 # 画像ファイルを読め込めなかった場合にはcv2.imreadは'None'を返します。 image = cv2.imread("not_exist_image.jpg") if image is not None: print("画像ファイルを読み込みました。") else: print("画像ファイルを読み込めませんでした。")
アルファチャンネルを含む画像の読み込み
アルファチャンネルとは画像の透過情報のチャンネルです。PNGやGIFファイルに含まれていますが、JPEGやBMPではアルファチャンネルを扱うことができません。
アルファチャンネルを含む画像を読み込むには、cv2.imread
関数のImreadModesにcv2.IMREAD_UNCHANGEDを指定します。cv2.imread
関数の戻り値データのチャンネル数を確認することで、読み込んだ画像にアルファチャンネルが含まれているかどうか判断することができます。
import cv2 # cv2.IMREAD_UNCHANGEDを指定することで、アルファチャンネルを持つ画像を読み込むことができます。 image = cv2.imread("alpha_image.png", cv2.IMREAD_UNCHANGED) # アルファチャンネルの有無を調べる if image.shape[2] == 4: # アルファチャンネルがある場合 print("この画像はアルファチャンネルを含みます。") else: # アルファチャンネルがない場合 print("この画像はアルファチャンネルが含まれていません。")
おわりに
OpenCVを使用して画像を正しく読み込む方法についての基本を解説しました。OpenCVを活用して、さまざまな画像処理を行ってみてください。
最後までご覧いただきありがとうございました。
■OpenCVの参考書としてどうぞ!■
参考リンク
OpenCV: Image file reading and writing
The function imread loads an image from the specified file and returns it. If the image cannot be read (because of missing file, improper permissions, unsupported or invalid format), the function returns an empty matrix ( Mat::data==NULL ).
cv2.imread: checking if image is being read
I'm writing an OpenCV program in python, and at some point I have something like import cv2 import numpy as np ... img = cv2.imread("myImage.jpg") # do stuff with image here The problem is th...