[Python]OpenCVの使い方解説 画像の読込と書込
画像処理ライブラリの定番OpenCV 基本動作の画像読込と書込を説明
最近人気のPythonを使った画像処理の勉強をしていきたいと思います。
使用するライブラリは画像処理の定番ライブラリであるOpenCVです。開発環境一式は下に書いておきます。
- 開発環境:VisualStudio2019 (2017などでも可)
- 開発言語:Python
- 使用ライブラリ:OpenCV
恐らくこの記事をみている読者の方はこれから画像処理を勉強する方かと思われます。その場合,今回書いて行く記事はそれなりに助力になると思いますので是非最後まで読んでいってください。
今回紹介するOpenCVを用いた画像の読み込みと書き込みについては [Python] 画像処理の基本解説 OpenCVの使い方入門 でも簡単に触れていますのでそちらもあわせて参考に願います。
5分で分かるOpenCV 画像の読込imreadと書込imwriteを動画解説
今回の趣旨である画像の読み込みと書き込みを動画解説しようと思います。
使用するのはOpenCVのimread(読込)とimwrite(書込)です。画像をプログラム上で読み込むのにimreadを使用しますが,画像の読み込み方にはいくつか種類があります。この動画ではその種類と,どのように画像を読み込めるかを解説しています。
import cv2
img_COLOR = cv2.imread('C:/Temp/towa.jpg',cv2.IMREAD_COLOR) #cv2.IMREAD_COLORは数字の1が入っている
img_GRAYSCALE = cv2.imread('C:/Temp/towa.jpg',cv2.IMREAD_GRAYSCALE) #cv2.IMREAD_GRAYSCALEは数字の0が入っている
img_UNCHANGED = cv2.imread('C:/Temp/towa.jpg',cv2.IMREAD_UNCHANGED) #cv2.IMREAD_UNCHANGEDは数字の-1が入っている
cv2.imwrite('C:/Temp/COLOR.jpg',img_COLOR) #画像をCOLORで保存
cv2.imwrite('C:/Temp/GRAYSCALE.jpg',img_GRAYSCALE) #画像をGRAYSCALEで保存
cv2.imwrite('C:/Temp/UNCHANGED.jpg',img_UNCHANGED) #画像をUNCHANGEDで保存
このプログラムを実行した場合の出力画像がこちらになります。元画像に加えて3種類の画像が出力されている事が分かります。
OpenCVの読込関数であるimreadは文字通り画像からピクセルの情報を抜き出して戻り値としてnumpy.ndarrayを出します。
今回の動画では以下3種類の引数を付けた場合のimreadで読み込み画像がどう変化するかを確認しています。
- cv2.IMREAD_COLOR
- cv2.IMREAD_GRAYSCALE
- cv2.IMREAD_UNCHANGED
最も基本の読み込み方 cv2.IMREAD_COLOR
まずcv2.IMREAD_COLORの読み込み結果を比較してみます。
なんだろう・・・同じ画像のはずなのに若干違う気もしますね・・・。何か違和感がありますがちゃんと同じ画像です。
cv2.IMREAD_COLORを引数としてimreadした場合,
読み込んだ画像を3チャンネルカラー画像として読み込む
という処理になります。今回読み込んだjpg画像であれば読込画像と全く同じ画像が出力されます。
頻繁に使うグレー画像の読み込み cv2.IMREAD_GRAYSCALE
次にcv2.IMREAD_GRAYSCALEの読み込み結果を比較していきます。
明らかに元画像と読み込んだ画像が異なりますね。なんかレトロというか昭和の画像のような・・・でもそんなレトロな感じもカワイイですね。
cv2.IMREAD_GRAYSCALEを引数としてimreadした場合,
読み込んだ画像を強制的にグレースケール画像にして読み込む
という処理になります。そのため読込画像を自動的にグレースケール化してくれる便利機能です。多くの画像処理アプリは取得した画像をグレースケールにしてから処理しています。頻繁に使うモードなのでこの機能は有効活用しましょう。
何のためにあるのか分からない cv2.IMREAD_UNCHANGED
最後にcv2.IMREAD_UNCHANGEDの読み込み結果を比較していきます。
うーん変わらないですねぇ・・・。まぁUNCHANGEDなんていかにも変化がなさそうな名前の引数ですもんね・・。
いちおうcv2.IMREAD_UNCHANGEDを引数としてimreadした場合,
読み込んだ画像を何も変換せずに読み込む
という,引数を何も指定しない場合と同じ処理を実施します。これなんのためにあるんだ・・・?
今回紹介したimread(いちおうimwriteも)ではこの3種類の読込を使いこなす必要があります(実質2種類ですね)。
特にグレースケールは頻繁に使う事になるので是非活用してください。