はじめに
こちらの記事https://qiita.com/Daiki_P/items/e2a67be67992783ef2e2 で画像表示について簡単にまとめました. 次はこの画像の保存についてまとめたいと思います. 個人的には意外と面倒だと感じます.
import cv2
from matplotlib import pyplot as plt
img = cv2.imread("Pasta.jpg") #BGRで取得.
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) #BGRをRGBに変換.
plt.imshow(img)
plt.show()
OpenCVの関数で保存
素直に書くと以下のようにcv2.imwriteを書いてしまうこともあると思います. しかし, OpenCVのcv2.imwriteはBGRの順で書き込むので, RGB変換をしたことが原因で変な画像となってしまいます.
失敗例
# imreadで読み込んだ画像をRGBに変換したのがimg.
# このimgをそのままimwriteに渡すと保存結果が不自然になる.
import cv2
from matplotlib import pyplot as plt
img = cv2.imread("Pasta.jpg") #BGRで取得.
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) #BGRをRGBに変換.
cv2.imwrite("Past_write.jpg",img)
plt.imshow(img)
plt.show()
なので, こうするのが一つの対策です. 変数名を変えて, imgを避難させただけです.
成功例
# matplotlibでの表示はRGBのimg_RGBで行う.
# opencvでの保存はBGRのimgで行う.
import cv2
from matplotlib import pyplot as plt
img = cv2.imread("Pasta.jpg") #BGRで取得.
img_RGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) #BGRをRGBに変換.
cv2.imwrite("Past_write.jpg",img)
plt.imshow(img_RGB)
plt.show()
最後に
今回は, OpenCVの関数での画像保存について書きました. matplotlibのsavefigでも画像保存が可能ですが, 軸や余白の設定がやや煩雑となり, OpenCVのimwriteの方がスッキリと書けると個人的には思うので, そのようにしました.