Pythonを勉強している学生が、OpenCVを使って画像の簡単な編集をPythonで実現するためのコードをまとめてみました。私と同様にOpenCVって何?って人向けにOpenCVについての知りたいような情報も追記しました。
OpenCVの使い方がわからずに悩んでいる方のお役に立てればと思います。
参考にしている書籍は、PythonによるAI・機械学習・深層学習アプリのつくり方です。こちらの書籍を見ながらこの記事を見ていただければ理解しやすいと思います。
■OpenCVのモジュールを使ったコードまとめ
この記事で扱う画像は、イラスト屋からお借りしてきたものを使います。参考までに載せておきます。
さっそく画像の読み込みから始めていきましょう!
・画像を読み込む
まず初めに画像を読み込むコードです。画像の読み込みには、imreadモジュールを使います。以下のコードを確認してください。
1 2 3 4 |
import cv2 #OpenCVをインポート img = cv2.imread("test.jpg") #imreadモジュールでtest.pngを読み込む print(img) #読み込んだ画像の画素データを出力 |
imread(“画像ファイルの名前”)のように記述します。注意点としては、画像ファイル名の拡張子まで指定することです。 正しく画像ファイルが読み込まれると、以下のように画素データが行列形式で出力されることを確認しましょう。
1 2 3 4 5 6 7 |
[[[0 0 0] [0 0 0] [0 0 0] ... [0 0 0] [0 0 0] [0 0 0]]] |
私の読み込んだ画像は、背景に色がないため、0の羅列のように表示されてしまいましたが、これはこれで問題ないです。
拡張子を記述しなかったり、ファイル名が間違っていると、Noneと表示されるので、その場合、ファイル名を正しく記述し直してみてください。
画像の読み込みはここまでです。次は読み込んだ画像を表示してみましょう。
ターミナル、もしくはコンソール内で、matplotlibモジュールをインストールしてください。
1 |
$ pip install matplotlib |
以下のようにコードを変更します。
1 2 3 4 5 6 |
import matplotlib.pyplot as plt #画像を表示するためのモジュール import cv2 #OpenCVをインポート img = cv2.imread("test.jpg") #imreadモジュールでtest.pngを読み込む plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) #画像の色配置を変換する plt.show() #画像を表示 |
OpenCVの色配置は、[青、緑、赤(BGR)]、matplotlibの色配置は、[赤、緑、青(RGB)]なので、plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))により、色配置をRGBへ変更。
show()はそのままの意味で、画像を表示しています。
・画像を保存する
画像の保存は、imwrite()モジュールを使います。以下のコードを確認してください。
1 2 3 4 5 |
import cv2 #OpenCVをインポート img = cv2.imread("test.jpg") #imreadモジュールでtest.pngを読み込む cv2.imwrite("result.png", img) #読み込んだファイルをresult.pngとして保存 |
imwrite(“保存するときのファイル名”, 画像を代入した変数)のように記述します。
OpenCVは、代表的な画像形式をサポートしているので、自分の好きな形式が選べますよ。
出力されたresult.pngを以下に載せます。
!!!背景の色が変わっている。。。これは、画像を読み込むときに透明だった部分に[0 0 0]という行列が与えられたためだと思われます。
そして[0 0 0]がさす色は黒なので、背景が「透明」→「黒」に代わってしまったんですね。「透明」部分は出力されると「黒色」に変わることが覚えれたのでまあ良かったとしよう。。。
・画像をリサイズする
画像をリサイズするコードは以下になります。
1 2 3 4 5 6 7 8 9 10 |
import matplotlib.pyplot as plt #画像を表示するためのモジュール import cv2 #OpenCVをインポート img = cv2.imread("test.jpg") #imreadモジュールでtest.pngを読み込む img_res = cv2.resize(img, (800,300)) #画像をリサイズ plt.imshow(cv2.cvtColor(img_res, cv2.COLOR_BGR2RGB)) #画像の色配置を変換して表示する plt.show() #画像を表示 cv2.imwrite("resize_img.png", img_res) #リサイズした画像を保存 |
img_res = cv2.resize(リサイズしたい画像, (幅,高さ))で画像をリサイズします。今回使った画像は(400, 300)→(800,300)にしてみました。結果は以下の画像です。横幅が800、縦幅が300にリサイズできてますね。
・画像を切り取る
画像の切り取りは、以下のコードです。
1 2 3 4 5 6 7 8 9 10 11 |
import matplotlib.pyplot as plt #画像を表示するためのモジュール import cv2 #OpenCVをインポート img = cv2.imread("test.jpg") #imreadモジュールでtest.pngを読み込む img_res = img[100:500, 100:500] #画像の一部を切り抜き plt.imshow(cv2.cvtColor(img_res, cv2.COLOR_BGR2RGB)) #画像の色配置を変換して表示する plt.show() #画像を表示 cv2.imwrite("cut_img.png", img_res) #リサイズした画像を保存 |
img_res = img[100:500, 100:500]の部分で、x座標が100~500、y座標が100~500の範囲の画素データのみを抽出して切り取りを行っています。
結果は以下のようになりました。
■OpenCVとは
OpenCVは、Open Source Computer Vision Libraryの略で、意味はそのままのオープンソースの画像ライブラリのことを指します。もともとはインテルが開発し、公開しました。
概要はwikipediaから抜粋させていただきます。
上記のように、あらゆるプログラミング言語で扱えるかつ、OSのサポートも充実していることが最大の魅力。
できることは、画像処理、機械学習、パターン認識などといろいろあり、PythonとOpenCVを使えば顔認識や文字認識もできちゃいます。
私はOpenCV=画像処理の強力なライブラリって認識しています。
■まとめ
今回紹介したコードが使えるのは以下のような場面です。
・画像を保存したいとき(imwrite)
・画像を拡大縮小したいとき(resize)
・画像を切り抜きたいとき(配列指定)
・画像の色を変換したいとき(imshow)
OpenCVは画像処理を行うための強力なライブラリなので覚えていきたいと思います。
次回紹介する顔検出でもOpenCVを使うので、画像認識をしたい人には必須になりそうですね。
特に今回紹介したコードはどれも処理を行うときには必ず使うものばかりなので覚えておきましょう。
最後まで読んでいただきありがとうございました。