画像処理の自動化にはPythonがおすすめです。Pythonを学び始めている方のなかには、下記のように疑問がある方も多いのではないでしょうか。
- Pythonで画像処理をしたいけど、何ができるのかイマイチわからない…
- OpenCVが良いって聞くけど、ほかのライブラリじゃできないの?
今回は、OpenCVでできることやOpenCV以外で画像処理ができるPythonライブラリをまとめました。また、PythonとOpenCVを組み合わせた「顔検出」プログラムの実装手順も解説します。本記事ではOpenCVの魅力を理解したうえで、実装内容を確認できます。
Pythonで画像処理をしたい方は、ぜひ最後までご覧くださいね!
画像処理をPythonで行うなら「OpenCV」がおすすめ!
画像処理をPythonで行うなら、「OpenCV」が最もおすすめです!
OpenCVとは、オープンソースのコンピュータビジョンライブラリのことです。
PythonやC++など、さまざまなプログラミング言語で使用できます。
おすすめする理由は、画像認識や描画用のライブラリがたくさん収録されているため、OpenCVだけで処理できることが多いからです。
では、これから具体的にどのようなことができるのかを紹介します。
OpenCVでできること
OpenCVでは、検出・画像内への描画・前処理・ファイル処理など、画像処理に関するあらゆることができます。下記の表でできることの例をまとめたので、チェックしてみてくださいね!
処理項目 | 具体例:ライブラリ名 |
---|---|
オブジェクト検出系 | ・顔や物体検出:cv2.CascadeClassifier
・物体追跡:cv2.TrackerMIL_create ・エッジ検出:cv2.Canny |
画像内への描画系 | ・線:cv2.line
・矢印:cv2.arrowedLine ・マーカー:cv2.drawMaker ・円:cv2.circle ・楕円:cv2.ellipse ・長方形や正方形:cv2.rectangle ・文字:cv2.putText |
前処理系 | ・リサイズ/応用するとモザイク処理も可能:cv2.resize
・回転:cv2.rotate ・ぼかし処理:cv2.blur ・2値化:cv2.threshold ・色空間変換:cv2.cvtColor |
ファイル処理系 | ・読み込み:cv2.imread
・保存:cv2.imwrite ・ヒストグラム作成:cv2.calcHist ・カラー画像出力:cv2.imshow |
機械学習系 | ・サポートベクターマシン:cv2.ml.SVM_create
・K近傍:cv2.ml.KNearest_creat ・ニューラルネットワーク:cv2.ml.ANN_MLP_create |
OpenCVでは、画像の前処理から機械学習まで可能です。なお、検出系や描画系の詳しい実装方法は下記を参考にしてみてくださいね!
【OpenCV以外】画像処理ができるPythonライブラリは?
Pythonでは、OpenCV以外にも画像処理で使えるライブラリがあります。OpenCV以外で、画像処理ができるPythonライブラリは下記の2つです。
Pythonライブラリ名 | 特徴 |
---|---|
NumPy | ・数値計算用のライブラリ ・多次元配列の処理やソート、平均・最大値の取得など、あらゆる数値計算をサポートしている |
Pillow | ・簡単な画像処理ができるPython用の画像処理ライブラリ ・リサイズや回転、トリミングが可能 |
OpenCVとNumPy、Pillowそれぞれで、同じ出力内容でもコードの書き方が大きく異なります。例えば、画像を回転させるコードは、下記のように違いがあります。
Pythonライブラリ名 | 回転コードの書き方 |
---|---|
OpenCV | cv2.rotate(回転させる画像, 回転角度) 角度指定:cv2.ROTATE_90_CLOCKWISE・cv2.ROTATE_180など |
NumPy | np.rot90(回転させる画像, 90度回転させる回数) |
Pillow | 回転させる画像.rotate(回転角度) |
では、OpenCVとNumPy、Pillowを比較するために、画像を回転させるコードをまとめて見てみましょう!実行環境は「Google Colaboratory」です。
# OpenCVバージョンの画像回転コード =====
import cv2
# 1.画像の読み込み
img = cv2.imread("/content/Lenna.png")
# 2.90度回転
opencv_90rotate = cv2.rotate(img, cv2.ROTATE_90_COUNTERCLOCKWISE)
# 3.画像保存
cv2.imwrite('opencv_90rotate.jpg', opencv_90rotate)
# Numpyバージョンの画像回転コード =====
import numpy as np
from PIL import Image
# 1.画像の読み込み
img = np.array(Image.open("/content/Lenna.png"))
# 2.90度回転
# 第二引数:90度回転させる回数
numpy_90rotate = np.rot90(img)
# 3.画像保存
Image.fromarray(numpy_90rotate).save("numpy_90rotate.jpg")
# Pillowバージョンの画像回転コード =====
from PIL import Image
# 1.画像の読み込み
img = Image.open("/content/Lenna.png")
# 2.90度回転
pillow_90rotate = img.rotate(90)
# 3.画像保存
# quality:解像度(1~100)
pillow_90rotate.save("pillow_90rotate.jpg", quality=95)
それぞれを実行すると、下記のように元画像を反時計回りに回転させた画像が得られます。
同じ出力結果が得られる処理が多いとはいえ、どのライブラリでも推奨できるわけではありません。
C++ではなくPythonで画像処理をする場合には、NumPyよりもOpenCVがおすすめです。NumPyでは1から画像処理用の関数やクラスの実装が必要になるケースも多く、初心者には難易度が高いからです。
また、Pillowは処理できる内容が少ないため、基本的にはおすすめしません。したがって、画像の認識や検知をスムーズに行いたい場合には、OpenCVを習得するのが近道です!
NumPyとPillowについては、下記で詳しく扱っているので参考にしてみてください。
【入門】Pythonの画像処理ライブラリで顔検出コードを実装
では、Pythonを使って顔を検出するプログラムを実装してみましょう。今回のテーマは、PythonとOpenCVを使って画像内の顔を検出するコードを実装することです!
実装手順は下記のとおりです。
- OpenCVや画像、学習済みモデルの準備
- 顔を検出するコードをOpenCVで実装
実装環境は、クラウド上でPythonを使える「Google Colaboratory」を使用します。
事前準備|OpenCVのインポート・画像の読み込み・学習済みカスケード分類器のダウンロード
では、顔検出に必要な準備工程を説明します。事前準備で行うことは、下記のとおりです。
- OpenCVのインポート
- 画像の読み込み
- 学習済みのカスケード分類器のダウンロード
まずは、OpenCVをインポートする必要があります。Google Colabでは、OpenCVがすでにインストールされているため、下記のようにモジュールをインポートするだけでOKです。
import cv2
WindowsやLinux環境で行う場合のOpenCVのインストール方法は、下記でチェックしてくださいね。
次に、画像ファイルをGoogle Colaboratory上にアップロードしましょう。Google Colaboratoryでは、画像をドラッグ&ドロップでアップロードが完了します。
画像をアップロードしたら、画像を読み込みます。画像を読み込むコードは下記のとおりです。
# 顔を検出する画像のパス
img_path = "/content/Lenna.png"
# 画像を読み込む
img = cv2.imread(img_path)
最後に、学習済みのカスケード分類器を用意します。
カスケード分類器とは、複数の識別器を組み合わせた分類器のこと
OpenCV公式の「Releases」から、Sorcesをクリックしてzipファイルをパソコン上へダウンロードしましょう。
ダウンロードしたzipファイルを解凍して、「opencv-バージョン/data/haarcascade」の中に学習済みのカスケード分類器のファイルがあるかどうか確認してください。
そして、使うxmlファイルをドラッグ&ドロップで、Google Colaboratory上にアップロードしましょう。今回は正面を向いた顔の検出を行いますので、「haarcascade_frontalface_alt.xml」をアップロードする必要があります。
学習済みのカスケード分類器はOpenCVの公式Githubからもダウンロードできますが、環境によっては使用時にエラーが発生する可能性があります。
そのため、OpenCV公式の「Releases」からダウンロードする方法をおすすめします。
以上で事前準備は完了です。
顔検出プログラムの実装
事前準備が完了したら、顔検出の実装をしていきましょう。実装コードは下記を参考にしてくださいね。
import cv2
# 顔を検出する画像のパス
img_path = "/Lenna.png"
# 画像を読み込む
img = cv2.imread(img_path)
# 正面を向いている顔を学習したカスケード分類器が保存されているパス
cascade_path = "/haarcascade_frontalface_alt.xml"
# 学習済みモデルを読み込む
cascade = cv2.CascadeClassifier(cascade_path)
# 画像をグレースケールに変換
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 顔を検出する
face_detect = cascade.detectMultiScale(img_gray)
# 検出した顔を赤く囲む
img_copy = img.copy()
for (x,y,w,h) in face_detect:
cv2.rectangle(img_copy, (x, y), (x+w, y+h), color=(0, 0, 255), thickness=3)
# 顔検出後の画像表示
cv2.imwrite("Lennaface_detect.png", img_copy)
実行すると、下記の画像が保存されます。
しっかりと、顔を検出できていますね!
顔検出モデルの「cv2.CascadeClassifier」は、グレースケールの画像でなければエラーが出るため、分類器に入れる画像を「cv2.cvtColor」でグレースケールへ変更します。
OpenCVでは「カスケード分類器.detectMultiScale(グレースケール画像)」と記述するだけで、顔検出ができます。さらにはカスケード分類器の種類を変えるだけで、今回の正面を向く人の顔以外にも猫・笑顔・メガネをかけた人・車のナンバーなど、さまざまな検出が可能です。
またOpenCVでは画像内への描画も可能なため、検出した顔のピクセルデータをもとに四角形を描画すれば、正しく顔を検出できたのかが一目でわかります。
今回の内容のように、OpenCVを使えば簡単に画像の取り込み・前処理・検出・可視化まで実装できます。
下記では顔検出以外のOpenCVを使った実装コードを紹介しているので、参考にしてみてください!
画像処理をPythonでする時に役立つ本
OpenCVやPythonには、画像認識や検出など、さまざまな目的別の本が提供されています。そのため、本を使って知識や実装スキルを身につけるのも一つの方法です。
Pythonで画像処理をするときには、下記の2冊がおすすめです。
書籍名 | 特徴 | メリット | おすすめな人 |
---|---|---|---|
OpenCVによる画像処理入門 改訂第2版 (KS情報科学専門書) | 画像処理アルゴリズムの内部処理の解説をもとに、PythonとOpenCVでの実装方法を解説している本 | 各関数のパラメータや選び方から丁寧に解説されているので、OpenCVの基本を押さえられる | PythonとOpenCVの基本的な使い方を習得したい人 |
OpenCVではじめようディープラーニングによる画像認識・物体 | OpenCVをサポートする言語や前処理用のモジュールの解説など、画像処理の基礎内容が網羅された本 | 基本を押さえたうえで、OpenCVを使ったディープラーニングの基礎~応用レベルの実装方法を学べる | OpenCVの概要やディープラーニングモジュールの使い方を深く理解したい人 |
「OpenCVによる画像処理入門 改訂第2版 」はOpenCVの導入手順から、グラフィックス・アフィン変換・色空間の処理・フィルタ処理など、PythonとOpenCVを使って画像処理の基本スキルを学べる内容になっています。
一方で「OpenCVではじめようディープラーニングによる画像認識・物体」の方は、ディープラーニングモジュールを使った実装方法の説明も含まれており、最新の画像処理技術も習得できるメリットがあります。
そのため、基本的な内容をしっかりとインプットしたい場合には「OpenCVによる画像処理入門」がおすすめで、OpenCVでディープラーニングをしたい場合には「Pythonで始めるOpenCV 4プログラミング」を選ぶと良いでしょう。
ただし、本を使っても解決しないことがあるときや、本の解説内容でわからないことがあるときは「Tech Teacher」に相談してくださいね!
データサイエンスを学習するならTech Teacherで!
『Tech Teacher』3つの魅力
魅力1. オーダーメイドのカリキュラム
『Tech Teacher』では、決められたカリキュラムがなくオーダーメイドでカリキュラムを組んでいます。「質問だけしたい」「相談相手が欲しい」等のご要望も実現できます。
魅力2. 担当教師によるマンツーマン指導
Tech Teacherでは、完全マンツーマン指導で目標達成までサポートします。
東京大学を始めとする難関大学の理系学生・院生・博士の教師がが1対1で、丁寧に指導しています。
そのため、理解できない箇所は何度も分かるまで説明を受けることができます。
魅力3. 3,960円/30分で必要な分だけ受講
Tech Teacherでは、授業を受けた分だけ後払いの「従量課金制」を採用しているので、必要な分だけ授業を受講することができます。また、初期費用は入会金22,000円のみです。一般的なプログラミングスクールとは異なり、多額な初期費用がかからないため、気軽に学習を始めることができます。
まとめ
・魅力1. 担当教師によるマンツーマン指導
・魅力2. オーダーメイドのカリキュラム
・魅力3. 3,960円/30分で必要な分だけ受講
質問のみのお問い合わせも受け付けております。
『Tech Teacher』3つの魅力
魅力1. オーダーメイドのカリキュラム
『Tech Teacher』では、決められたカリキュラムがなくオーダーメイドでカリキュラムを組んでいます。「質問だけしたい」「相談相手が欲しい」等のご要望も実現できます。
魅力2. 担当教師によるマンツーマン指導
Tech Teacherでは、完全マンツーマン指導で目標達成までサポートします。
東京大学を始めとする難関大学の理系学生・院生・博士の教師がが1対1で、丁寧に指導しています。
そのため、理解できない箇所は何度も分かるまで説明を受けることができます。
魅力3. 3,960円/30分で必要な分だけ受講
Tech Teacherでは、授業を受けた分だけ後払いの「従量課金制」を採用しているので、必要な分だけ授業を受講することができます。また、初期費用は入会金22,000円のみです。一般的なプログラミングスクールとは異なり、多額な初期費用がかからないため、気軽に学習を始めることができます。
まとめ
・魅力1. 担当教師によるマンツーマン指導
・魅力2. オーダーメイドのカリキュラム
・魅力3. 3,960円/30分で必要な分だけ受講
質問のみのお問い合わせも受け付けております。
まとめ
Pythonには、OpenCVやPillow、NumPyといった画像処理ができるライブラリがあります。特におすすめなのはOpenCVで、画像処理用の関数が豊富なため、下記のようにさまざまなことができます。
- 検出
- 画像内への描画処理
- 前処理
- 機械学習
OpenCVを習得するときには参考書を利用するのも良いですが、自分でエラーを解決しなければならないため初心者にとっては大変です。
エラーの解決をスムーズにしたい場合には、「Tech Teacher」がおすすめです!TechTeacherでは、画像処理やOpenCVに熟知した講師から、マンツーマンでレッスンを受けられるメリットがあります。
OpenCVの悩みがある方は、お気軽にお問い合わせください。