ITや趣味など気軽に投稿しています。

【Python】OpenCVで画像を表示・保存する

画像を読み込んだ後は、その画像を表示して確認したり、処理結果をファイルとして保存する操作が必要になります。

この記事では、OpenCVのcv2.imshow()による画像の表示とcv2.imwrite()による画像の保存方法について解説します。

画像の表示

画像の表示にはcv2.imshow()を使用します。

import cv2

# 画像の読み込み
img = cv2.imread("input/fox.jpg")

# 画像のサイズ変更
height = img.shape[0]
width = img.shape[1]
resized_img = cv2.resize(img, (round(width / 4), round(height / 4)))

# 画像をウィンドウで表示
cv2.imshow("sample", resized_img)

# キー入力待ち
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imshow() 出力画像

imshow()の第1引数はウィンドウ名、第2引数は表示する画像です。上の例では"sample"というウィンドウ名でresized_imgが表示されます。

cv2.waitKey(0)は、キーボードが押されるまで処理を停止します。これがないとプログラムが即座に終了し、画像ウィンドウを確認できません。

cv2.destroyAllWindows()は、開いているすべてのウィンドウを閉じます。プログラム終了時に自動的に閉じられますが、明示的に記述しておくことが推奨されます。

画像の保存

画像の保存にはcv2.imwrite()を使用します。

import cv2

# 画像の読み込み
img = cv2.imread("input/fox.jpg")
height = img.shape[0]
width = img.shape[1]
resized_img = cv2.resize(img, (round(width / 4), round(height / 4)))

# 画像をグレースケールに変換
img_gray = cv2.cvtColor(resized_img, cv2.COLOR_BGR2GRAY)

# 画像の保存
cv2.imwrite("gray_img.jpg", img_gray)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite() 出力画像

cv2.imwrite()の第1引数は出力ファイル名、第2引数は保存する画像です。出力ファイル名で指定した拡張子のフォーマットで自動的に出力されます。

対応フォーマット

種類拡張子
Windowsビットマップ.bmp,.dib
JPEGファイル.jpeg,.jpg, *.jpe
JPEG2000ファイル*.jp2
Portable Network Graphics*.png
Portable image format.pbm,.pgm, *.ppm
Sun rasters.sr,.ras
TIFFファイル.tiff,.tif

JPEGの出力品質

出力フォーマットがJPEGの場合、出力時の品質をパーセントで指定できます。

cv2.imwrite()の第3引数に[cv2.IMWRITE_JPEG_QUALITY, 品質パーセント]を指定します。

import cv2

# 画像の読み込み
img = cv2.imread("photoA.jpg")
height = img.shape[0]
width = img.shape[1]
resized_img = cv2.resize(img, (round(width / 4), round(height / 4)))
img_gray = cv2.cvtColor(resized_img, cv2.COLOR_BGR2GRAY)

# 100%品質
cv2.imwrite("gray_img1.jpg", img_gray, [cv2.IMWRITE_JPEG_QUALITY, 100])
# 10%品質
cv2.imwrite("gray_img2.jpg", img_gray, [cv2.IMWRITE_JPEG_QUALITY, 10])

cv2.waitKey(0)
cv2.destroyAllWindows()

100%品質と10%品質を比較すると、品質の違いが確認できます。

100%品質(gray_img1.jpg)

10%品質(gray_img2.jpg)

10%品質では画像が粗くなっていることがわかります。ファイルサイズを抑えたい場合は品質を下げ、高画質が必要な場合は品質を上げて使い分けます。

まとめ

今回は、OpenCVで画像を表示・保存する方法を紹介しました。

  • 表示: cv2.imshow() でウィンドウに画像を表示する
  • 保存: cv2.imwrite() で画像をファイルに保存する
  • JPEG出力時はIMWRITE_JPEG_QUALITYで品質を指定可能
  • cv2.waitKey(0)cv2.destroyAllWindows() はセットで使うのが基本