はじめに
PythonでOpenCVを使った画像の書き出しに使うcv2.imwrite
関数について解説します。
画像の書き出し
画像の書き出しはcv2.imwrite
関数を使います。保存する画像のフォーマットはファイル名の拡張子で指定します。8-bitグレースケール、または3チャンネル("BGR"の順番)の画像を保存します。
cv2.imwrite関数
3つの引数が用意されていて、戻り値のMatオブジェクトに画像データが格納されます。
引数
名称 | 説明 |
出力画像ファイル名(必須) | 出力する画像ファイルのパスとファイル名 |
img(必須) | 書き出す画像データ |
params(オプション) | ImwriteFlag として定義されているエンコーダーに渡すフラグ |
戻り値
True
: 画像の書き出しが成功した場合False
: 画像の書き出しが失敗した場合
解説
画像形式は、ファイル名の拡張子に基づいて選択されます。対応する画像フォーマットを下表に示します。
画像フォーマット | 拡張子 | 保存されるデータ型 |
JPEG | .jpeg または .jpg | 16-bit unsigned(CV_16U) |
PNG | .png | 16-bit unsigned(CV_16U) アルファチャンネルを含めて保存することもできます。この場合、8-bit(または16-bit)4チャンネルのデータとなりアルファチャンネルは最後に追加されるBGRAの順番になります。 完全な透明を表すアルファチャンネルの値は0で、透明度が全くない状態を示すアルファチャンネルの値は255/65535です。 |
TIFF | .tiff または .tif | 16-bit unsigned(CV_16U)または 32-bit float (CV_32F) 3チャンネル(CV_32FC3)の場合はハイダイナミックレンジ エンコーディングのLogLuvを使用して保存され、1ピクセルは4バイトとなります。 また、複数の画像を保存することもできます。 |
JPEG2000 | .jp2 または .jpc | 16-bit unsigned(CV_16U) |
PFM | .pfm | 32-bit float (CV_32F) |
OpenEXR | .exr | 32-bit float (CV_32F) |
フラグは次の様にリストで指定します。
[フラグ1, 値1, フラグ2, 値2, フラグ3, 値3, …]
フラグの使用例
引数のImwriteFlag
は以下の様に定義されています。
# 画質を0に指定してJPEGで保存します。 result = cv2.imwrite('duck_worst.jpg', image, [cv2.IMWRITE_JPEG_QUALITY, 0])
モード | 説明 |
cv2.IMWRITE_JPEG_QUALITY | JPEG形式で保存する場合の画質を0〜100で指定します。デフォルト値は95。 |
cv2.IMWRITE_JPEG_PROGRESSIVE | 1を指定するとプログレッシブJPEGを有効にして保存します。デフォルト値は0。 |
cv2.IMWRITE_JPEG_OPTIMIZE | 1を指定するとJPEGのファイルサイズの最適化を有効にして保存します。デフォルト値は1。 |
cv2.IMWRITE_JPEG_RST_INTERVAL | JPEGのリスタートインターバルのリスタートマーカーを挟む間隔を0〜65535で指定します。デフォルト値は0(リスタートしない)。 |
cv2.IMWRITE_JPEG_LUMA_QUALITY | JPEGの輝度(Luma)のクオリティーを0〜100で指定します。デフォルト値は0。 |
cv2.IMWRITE_JPEG_CHROMA_QUALITY | JPEGの色味(Chroma)のクオリティーを0〜100で指定します。デフォルト値は0。 |
cv2.IMWRITE_PNG_COMPRESSION | PNGの圧縮レベルを0〜9で指定します。数値が大きいほどファイスサイズが小さくなり、圧縮の時間が長くなります。デフォルト値は1。これを指定した場合、圧縮アルゴリズムはIMWRITE_PNG_STRATEGY_DEFAULT (Z_DEFAULT_STRATEGY )になります。デフォルト値は0。 |
cv2.IMWRITE_PNG_STRATEGY | PNGの圧縮を指定します。詳細はImwritePNGFlagsを参照。デフォルト値はIMWRITE_PNG_STRATEGY_RLE |
cv2.IMWRITE_PNG_BILEVEL | バイナリーレベル PNG。パラメータは0または1。デフォルト値は0。 |
cv2.IMWRITE_PXM_BINARY | PPM, PGM, または PBM形式のバイナリー フォーマットにする。パラメータは0または1。デフォルト値は0。 |
cv2.IMWRITE_EXR_TYPE | EXR形式のストレージタイプを上書きします。デフォルトはFLOAT。 |
cv2.IMWRITE_EXR_COMPRESSION | EXR形式のストレージタイプの置き換え。デフォルト値はFLOAT。 |
cv2.IMWRITE_WEBP_QUALITY | EXR圧縮タイプの置き換え。デフォルト値はZIP_COMPRESSION = 3。WEBP形式のクォリティを1〜100で指定します。(値が大きい方が高品質)パラメータなしか、101以上を指定するとロスレス圧縮となります。 |
cv2.IMWRITE_PAM_TUPLETYPE | PAM形式の場合、TUPLETYPEフィールドに、フォーマットに定義されている対応する文字列値を設定します。 |
cv2.IMWRITE_TIFF_RESUNIT | TIFF形式のDPI解像度を指定するために使用します。libtiffのドキュメントを参照してください。 |
cv2.IMWRITE_TIFF_XDPI | TIFF形式のX方向のDPIを指定するために使用します。 |
cv2.IMWRITE_TIFF_YDPI | TIFF形式のY方向のDPIを指定するために使用します。 |
cv2.IMWRITE_TIFF_COMPRESSION | TIFF形式の画像圧縮方法を指定するために使用します。圧縮形式に対応するinteger定数についてはlibtiffを参照してください。ビット深度がCV_32Fの画像の場合、libtiffのSGILOG圧縮のみが使用されます。サポートされる他のビット深度の場合、圧縮方法はこのフラグで指定することができます。デフォルト値はLZW圧縮です。 |
cv2.IMWRITE_JPEG2000_COMPRESSION_X1000 | JPEG2000形式のターゲット圧縮率を指定するために使用します。1000を掛けた値となります。0〜1000の範囲で指定します。デフォルト値は1000。 |
使い方
JPEGで保存(フラグなし)
result = cv2.imwrite('duck_out.jpg', image) # 出力先、ファイル名に日本語を使用しても問題なく出力されます。(上記環境以外では未確認) result = cv2.imwrite('あひる出力.jpg', image)
JPEGで画質"0"で画像を保存
result = cv2.imwrite('duck_out.jpg', image, [cv2.IMWRITE_JPEG_QUALITY, 0])
PNGで画像を保存(フラグなし)
result = cv2.imwrite('duck_out.png', image)
PNGで圧縮率を最大で画像を保存
result = cv2.imwrite('duck_comp_max.png', image, [cv2.IMWRITE_PNG_COMPRESSION, 9])
ソースコード
''' 様々なファイル形式でimagesフォルダに書き出します。 ''' import cv2 duck.jpg # Read file image = cv2.imread('image.jpg') # Write file as JPEG result = cv2.imwrite('duck_out.jpg', image) # Write file with Japanese file name result = cv2.imwrite('あひる出力.jpg', image) # Write file as PNG result = cv2.imwrite('duck_out.png', image) # Write file as worst quality JPEG result = cv2.imwrite('duck_worst.jpg', image, [cv2.IMWRITE_JPEG_QUALITY, 0]) # Write file as progressive JPEG result = cv2.imwrite('duck_progressive.jpg', image, [cv2.IMWRITE_JPEG_PROGRESSIVE, 1]) # Write file as optimized JPEG result = cv2.imwrite('duck_optimize.jpg', image, [cv2.IMWRITE_JPEG_OPTIMIZE, 1]) # Write file as JPEG luma=100 result = cv2.imwrite('duck_luma_max.jpg', image, [cv2.IMWRITE_JPEG_LUMA_QUALITY, 100]) # Write file as JPEG chroma=100 result = cv2.imwrite('duck_chroma_max.jpg', image, [cv2.IMWRITE_JPEG_CHROMA_QUALITY, 100]) # Write file as PNG compression=9 result = cv2.imwrite('duck_comp_max.png', image, [cv2.IMWRITE_PNG_COMPRESSION, 9])
このサンプルコードではJPEGの画質やPNGの圧縮の引数の使用例も含まれています。
また、下記の投稿では画像の読み込みで使用するcv2.imread関数について解説しているので、ご参考にしてください。
最後までご覧いただきありがとうございました。
■(広告)OpenCVの参考書としてどうぞ!■
参考リンク
OpenCV: Image file reading and writing
The function imwrite saves the image to the specified file. The image format is chosen based on the filename extension (see cv::imread for the list of extensions). In general, only 8-bit single-channel or 3-channel (with 'BGR' channel order) images can be saved using this function, with these exceptions: ...
OpenCV: Flags used for image file reading and writing
Imwrite flags.
libtiff / libtiff
TIFF Library and Utilities