【Python・OpenCV】OpenCVの使い初めの第一歩!画像の書き出し(cv2.imwrite)

※当サイトではアフィリエイト広告を利用しています

Python プログラミング 画像処理

【Python・OpenCV】OpenCVの使い初めの第一歩!画像の書き出し(cv2.imwrite)

2023-01-18

はじめに

PythonでOpenCVを使った画像の書き出しに使うcv2.imwrite関数について解説します。

(広告) OpenCV関連書籍をAmazonで探す

画像の書き出し

画像の書き出しはcv2.imwrite関数を使います。保存する画像のフォーマットはファイル名の拡張子で指定します。8-bitグレースケール、または3チャンネル("BGR"の順番)の画像を保存します。

cv2.imwrite関数

3つの引数が用意されていて、戻り値のMatオブジェクトに画像データが格納されます。

cv2.imwrite(出力画像ファイル名, img[, params])

引数

名称説明
出力画像ファイル名(必須)出力する画像ファイルのパスとファイル名
img(必須)書き出す画像データ
params(オプション)ImwriteFlagとして定義されているエンコーダーに渡すフラグ

戻り値

  • True: 画像の書き出しが成功した場合
  • False: 画像の書き出しが失敗した場合

解説

画像形式は、ファイル名の拡張子に基づいて選択されます。対応する画像フォーマットを下表に示します。

画像フォーマット拡張子保存されるデータ
JPEG.jpeg または .jpg16-bit unsigned(CV_16U)
PNG.png16-bit unsigned(CV_16U)
アルファチャンネルを含めて保存することもできます。この場合、8-bit(または16-bit)4チャンネルのデータとなりアルファチャンネルは最後に追加されるBGRAの順番になります。
完全な透明を表すアルファチャンネルの値は0で、透明度が全くない状態を示すアルファチャンネルの値は255/65535です。
TIFF.tiff または .tif16-bit unsigned(CV_16U)または 32-bit float (CV_32F)
3チャンネル(CV_32FC3)の場合はハイダイナミックレンジ エンコーディングのLogLuvを使用して保存され、1ピクセルは4バイトとなります。
また、複数の画像を保存することもできます。
JPEG2000.jp2 または .jpc16-bit unsigned(CV_16U)
PFM.pfm32-bit float (CV_32F)
OpenEXR.exr32-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_QUALITYJPEG形式で保存する場合の画質を0〜100で指定します。デフォルト値は95。
cv2.IMWRITE_JPEG_PROGRESSIVE1を指定するとプログレッシブJPEGを有効にして保存します。デフォルト値は0。
cv2.IMWRITE_JPEG_OPTIMIZE1を指定するとJPEGのファイルサイズの最適化を有効にして保存します。デフォルト値は1。
cv2.IMWRITE_JPEG_RST_INTERVALJPEGのリスタートインターバルのリスタートマーカーを挟む間隔を0〜65535で指定します。デフォルト値は0(リスタートしない)。
cv2.IMWRITE_JPEG_LUMA_QUALITYJPEGの輝度(Luma)のクオリティーを0〜100で指定します。デフォルト値は0。
cv2.IMWRITE_JPEG_CHROMA_QUALITYJPEGの色味(Chroma)のクオリティーを0〜100で指定します。デフォルト値は0。
cv2.IMWRITE_PNG_COMPRESSIONPNGの圧縮レベルを0〜9で指定します。数値が大きいほどファイスサイズが小さくなり、圧縮の時間が長くなります。デフォルト値は1。これを指定した場合、圧縮アルゴリズムはIMWRITE_PNG_STRATEGY_DEFAULT(Z_DEFAULT_STRATEGY)になります。デフォルト値は0。
cv2.IMWRITE_PNG_STRATEGYPNGの圧縮を指定します。詳細はImwritePNGFlagsを参照。デフォルト値はIMWRITE_PNG_STRATEGY_RLE
cv2.IMWRITE_PNG_BILEVELバイナリーレベル PNG。パラメータは0または1。デフォルト値は0。
cv2.IMWRITE_PXM_BINARYPPM, PGM, または PBM形式のバイナリー フォーマットにする。パラメータは0または1。デフォルト値は0。
cv2.IMWRITE_EXR_TYPEEXR形式のストレージタイプを上書きします。デフォルトはFLOAT。
cv2.IMWRITE_EXR_COMPRESSIONEXR形式のストレージタイプの置き換え。デフォルト値はFLOAT。
cv2.IMWRITE_WEBP_QUALITYEXR圧縮タイプの置き換え。デフォルト値はZIP_COMPRESSION = 3。WEBP形式のクォリティを1〜100で指定します。(値が大きい方が高品質)パラメータなしか、101以上を指定するとロスレス圧縮となります。
cv2.IMWRITE_PAM_TUPLETYPEPAM形式の場合、TUPLETYPEフィールドに、フォーマットに定義されている対応する文字列値を設定します。
cv2.IMWRITE_TIFF_RESUNITTIFF形式のDPI解像度を指定するために使用します。libtiffのドキュメントを参照してください。
cv2.IMWRITE_TIFF_XDPITIFF形式のX方向のDPIを指定するために使用します。
cv2.IMWRITE_TIFF_YDPITIFF形式のY方向のDPIを指定するために使用します。
cv2.IMWRITE_TIFF_COMPRESSIONTIFF形式の画像圧縮方法を指定するために使用します。圧縮形式に対応するinteger定数についてはlibtiffを参照してください。ビット深度がCV_32Fの画像の場合、libtiffのSGILOG圧縮のみが使用されます。サポートされる他のビット深度の場合、圧縮方法はこのフラグで指定することができます。デフォルト値はLZW圧縮です。
cv2.IMWRITE_JPEG2000_COMPRESSION_X1000JPEG2000形式のターゲット圧縮率を指定するために使用します。1000を掛けた値となります。0〜1000の範囲で指定します。デフォルト値は1000。
ImwriteFlags
(広告) OpenCV関連書籍をAmazonで探す

使い方

入力画像として、この画像を使用しました。

引用元
https://unsplash.com/photos/VTvnoNBowZs

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の参考書としてどうぞ!■

参考リンク

-Python, プログラミング, 画像処理
-