OpenCVで使われるimwriteとは?imwriteの定義から使用例をご紹介
今回はOpenCVで使われるimwriteに関して、定義から使用例をご紹介いたします。imwriteってなんだろう、最近OpenCVを使い始めた方へおすすめです。ぜひ最後までご一読ください。
執筆者 - おすすめの記事3選
OpenCVで使われるimwriteとは?
OpenCVで使われるimwriteとは、多次元配列(numpy.ndarray)情報を元に、画像を保存するものを意味します。
なぜ多次元配列(numpy.ndarray)から画像を保存するの?
それでは、なぜ多次元配列(numpy.ndarray)から画像を保存するのでしょう?
多次元配列から画像を保存する理由としては、
- カラー画像など、精度が求められる画像に対して、極め細かな画像を保存するため。
- OpenCV内に含まれる、関数の処理を容易にするため。
- 画像の加工や保存などの演算処理を、高速化するため。
が挙げられます。
確かに画像の加工や保存などの結果が遅いと、実運用を考える場合に、悩みの種になりそうなので、高速化は必要ですね。
OpenCVで使われるimwrite関数の定義
imwrite関数は、
1# cv2(OpenCV)を利用する宣言を行う。
2import cv2
3
4# imwrite : 画像の保存を行う関数
5#######################################
6# 第一引数 : 保存先の画像ファイル名(画像形式は、ファイル名拡張子に基づいて選択されます)
7# 拡張子とは? : https://ja.wikipedia.org/wiki/%E6%8B%A1%E5%BC%B5%E5%AD%90
8# <OpenCVで使用できる拡張子一覧 - 公式ドキュメントから引用(https://docs.opencv.org/3.4/d4/da8/group__imgcodecs.html#ga288b8b3da0892bd651fce07b3bbd3a56)>
9# Windows bitmaps - *.bmp, *.dib (always supported)
10# JPEG files - *.jpeg, *.jpg, *.jpe (see the __Note__ section)
11# JPEG 2000 files - *.jp2 (see the __Note__ section)
12# Portable Network Graphics - *.png (see the __Note__ section)
13# WebP - *.webp (see the __Note__ section)
14# Portable image format - *.pbm, *.pgm, *.ppm *.pxm, *.pnm (always supported)
15# Sun rasters - *.sr, *.ras (always supported)
16# TIFF files - *.tiff, *.tif (see the __Note__ section)
17# OpenEXR Image files - *.exr (see the __Note__ section)
18# Radiance HDR - *.hdr, *.pic (always supported)
19# Raster and Vector geospatial data supported by GDAL (see the __Note__ section)
20######################################
21
22# 第二引数 : 多次元配列(numpy.ndarray)
23# 第三引数(任意) : リスト型にてパラメータを指定する。
24# リスト型とは? : https://atmarkit.itmedia.co.jp/ait/articles/1905/31/news015.html
25# パラメータに関する公式ドキュメント : https://docs.opencv.org/4.0.1/d4/da8/group__imgcodecs.html#ga292d81be8d76901bff7988d18d2b42ac
26cv2.imwrite('./xxx.xxx', img, [{parameter}, {parameterValue}])
で定義されます。
例えば以下のようなコードを作成すると、
1import cv2
2# imread : 画像ファイルを読み込んで、多次元配列(numpy.ndarray)にする。
3# imreadについて : https://kuroro.blog/python/wqh9VIEmRXS4ZAA7C4wd/
4# 第一引数 : 画像のファイルパス
5# 戻り値 : 行 x 列 x 色の三次元配列(numpy.ndarray)が返される。
6img = cv2.imread('./xxx.xxx')
7# imwrite : 画像の保存を行う関数
8# 第一引数 : 保存先の画像ファイル名
9# 第二引数 : 多次元配列(numpy.ndarray)
10# <第二引数の例>
11# [
12# [
13# [234 237 228]
14# ...
15# [202 209 194]
16# ]
17# [
18# [10 27 16]
19# ...
20# [36 67 46]
21# ]
22# [
23# [34 51 40]
24# ...
25# [50 81 60]
26# ]
27# ]
28cv2.imwrite('./outputA.jpg', img)
29# imwrite : 画像の保存を行う関数
30# 第一引数 : 保存先の画像ファイル名
31# 第二引数 : 多次元配列(numpy.ndarray)
32# <第二引数の例>
33# [
34# [
35# [234 237 228]
36# ...
37# [202 209 194]
38# ]
39# [
40# [10 27 16]
41# ...
42# [36 67 46]
43# ]
44# [
45# [34 51 40]
46# ...
47# [50 81 60]
48# ]
49# ]
50####################################
51# 第三引数(任意) : リスト型にてパラメータを指定する。
52# cv2.IMWRITE_JPEG_QUALITY : JPEG画像の場合に、画像の品質を変更するもの。0から100までの値を設定でき、品質を変更できます(値が高いほど良い)。 デフォルト値は95。
53####################################
54# ※ JPEG画像は非可逆圧縮なので、元画像と保存した画像とでは画素値が異なります。元の画像をそのまま保存したい場合は、PNGやBMP形式などで保存することをおすすめします。
55# 画素値とは? : https://algorithm.joho.info/image-processing/digital-imaging/
56# 非可逆圧縮とは? : https://e-words.jp/w/%E9%9D%9E%E5%8F%AF%E9%80%86%E5%9C%A7%E7%B8%AE.html#:~:text=%E9%9D%9E%E5%8F%AF%E9%80%86%E5%9C%A7%E7%B8%AE%E3%81%A8%E3%81%AF,%E5%AE%8C%E5%85%A8%E3%81%AB%E3%81%AF%E4%B8%80%E8%87%B4%E3%81%97%E3%81%AA%E3%81%84%E3%80%82
57cv2.imwrite('./outputB.jpg', img, [cv2.IMWRITE_JPEG_QUALITY, 10])
以下の画像のように画像を保存します。
多次元配列情報からどのように画像が作られているのか、イメージ画像
imreadに関しては、OpenCVで使われるimreadとは?使い方から配列が画像になる仕組みを解説でまとめていますので、詳しく知りたい方は是非ご確認ください。
まとめ
- OpenCVで使われるimwriteとは、多次元配列(numpy.ndarray)情報を元に、画像を保存するものを意味します。
- 多次元配列(numpy.ndarray)から画像を保存する理由としては、以下3点があげられる。
- カラー画像など、精度が求められる画像に対して、極め細かな画像を保存するため。
- OpenCV内に含まれる、関数の処理を容易にするため。
- 画像の加工や保存などの演算処理を、高速化するため。
参考文献
- OpenCVで使われるimwrite関数に関するサンプルコード
- 多次元配列とは?
- 拡張子とは?
- OpenCVで活用できる拡張子一覧 - 公式ドキュメント
- リスト型とは?
- imwrite関数の第三引数で指定できるパラメータ一覧 - 公式ドキュメント
- 画素値とは?
- 非可逆圧縮とは?