Pythonは、機械学習やデータ分析をはじめとしたさまざまな分野で活躍するプログラミング言語ですよね。
Pythonは、記述が直感的で他の言語に比べて比較的少なく記述ができることから、プログラミング初学者にとっても非常に人気の高い言語の1つなのだとか。
また、Pythonはライブラリが豊富なため、AI(人工知能)やWeb開発など様々な分野を容易に実装できます。その中でも、Pythonは画像処理にも非常に力を発揮します。なぜなら、画像のトリミングや拡大・縮小、画像の合成など画像を処理する分野においても様々な画像処理をするライブラリがあるためです。
とはいえ、実際にどのような手順で、どんな画像処理ができるのか気になりますよね。そこで、今回はPythonを利用した画像処理の方法について、ライブラリごとにお伝えします。ライブラリの特徴を把握して、Pythonを使った画像処理をマスターしましょう。
画像処理とは、具体的にどんなことをするのか
画像処理は、画像のトリミング(切り取り)や画像のリサイズ(拡大・縮小)など画像に処理を加えることを言います。具体的な画像処理とは、次のようなものがあります。
画像の読み込み・保存
画像を読み込んで、処理を行える状態にしたり、処理した画像を保存したりすることです。画像を読み込む際には、カラー画像を二値画像(白黒画像)にして読み込んだりすることも可能です。
画像のトリミングやリサイズ
画像のトリミングは、読み込んだ画像の切り取り処理を行うことで、画像のリサイズは読み込んだ画像を拡大・縮小処理を行うことです。
画像の特徴点抽出
画像の特徴点とは、画像を判別するために特徴的な部分のことです。人間がジグソーパズルをつなぎ合わせるときの画像の手がかりとする部分と言い換えてもよいでしょう。機械が画像の特徴となる点を抽出する処理のことを画像の特徴量抽出といいます。この技術を使うことで、顔認識(顔の検出)や画像の合成などを行うことができます。
Pythonで画像処理を行うときに使うライブラリ
次に、Pythonで画像処理を行うために便利なライブラリを紹介します。
OpenCV
OpenCVは、インテルが開発をしたライブラリ。現在、Pythonを用いた画像処理において広く利用されているライブラリの1つで、主にJPEG、TIFF、PNGなどの画像形式の画像処理を行える点がOpenCVの特徴です。
OpenCVは、C++で記述されているため処理速度が速いことが特徴です。また、特徴点抽出など高度な画像処理を行うことができるライブラリであるため、顔認識や機械学習など様々な分野で利用されています。
Pillow(PIL)
Pillowは、開発が停止していたPIL(Python Image Library)をAlexが引き継いで開発・公開された画像処理ライブラリ。Pillowは、JPEG、TIFF、PNG、PDFなど幅広い画像形式の画像処理を行うことができます。
NumPy
NumPyは、数値計算を行うためのライブラリ。特に、多次元配列(行列やベクトル等)の計算で力を発揮するライブラリです。画像は、0と1の羅列であることことから、画像をN次元の行列として読み替えて処理をすることで、NumPyは力を発揮します。実際のPythonを用いた画像処理では、OpenCVやPillowと組み合わせて利用することが多いです。
Pythonで画像処理を行う方法~OpenCV編~
Pythonを用いた画像処理を、OpenCVを利用して行う方法をお伝えします。
まず、OpenCVをインストールする必要があります。pip install opencv-pythonのコマンドを実行すればインストールできるでしょう。もし、インストールできない場合は、pipのバージョンを最新版にしみましょう。pip install –upgrade pipまたは、pip install -U pipで実行できます。
次に、OpenCVを用いて画像の読み込み、画像の拡大を行い、画像の保存を行う方法をお伝えします。今回は、test.pngという画像を読み込んで、画像サイズを2倍にして、test2.jpgという画像に保存をする方法をお伝えします。
import cv2 #OpenCVのライブラリをインポートします。
#test.jpgを読み込みます。第2引数は、0(または、IMREAD_GRAYSCALE)を指定するとグレースケールで画像の読み込みが行われます。
width = pic.shape[1] #shapeメソッドを利用し、1番目の値が幅
img = cv2.resize(pic , (int(width*2), int(height*2)))#resize関数で幅、高さを2倍します。
cv2.imwrite(‘test2.jpg’ , img) #test2.jpgという名前で画像を保存する。
さらに、特徴点を抽出する方法をお伝えします。今回は、先ほど読み込んだtest.pngから特徴点を抽出する方法をお伝えします。
pic = cv2.imread(‘test.jpg’, IMREAD_GRAYSCALE)
from_key_points, from_descriptions = akaze.detectAndCompute(from_img, None)
# 特徴点抽出 (AKAZEというアルゴリズムを利用する方法)
display(extraceted_img)
# 特徴点を表示します。
すると、画像に検出された特徴点をマッピングした画像が表示されます。
Pythonで画像処理を行う方法~Pillow(PIL)編~
Pythonを用いた画像処理を、Pillow(PIL)を利用して行う方法をお伝えします。
まず、Pillow(PIL)をインストールする必要があります。pip install Pillowのコマンドを実行すればインストールできるでしょう。PILとPillowの両方をインストールできないため、過去にPILをインストールしている場合は、pip uninstall PILでアンインストールを行ってから、Pillowをインストールしましょう。
次に、Pillowを用いて画像の読み込み、画像の拡大を行い、画像の保存を行う方法をお伝えします。今回は、test.pngという画像を読み込んで、画像サイズを2倍にして、test2.jpgという画像に保存をする方法をお伝えします。
pic = Image.open(‘test.png’) #test.jpgを読み込みます。
img = pic.resize(int(pic.width* 2), int(pic.height* 2))#幅と高さを整数で指定をします。整数で指定をしなければいけないことに注意をしましょう。
img.save(‘test2.jpg’)
これらを実行すれば、容易に画像のリサイズを行うことができます。
Pythonで画像処理を行う方法~NumPy編~
Pythonを用いた画像処理を、NumPyを利用して行う方法をお伝えします。
まず、NumPyをインストールする必要があります。pip install numpyのコマンドを実行すればインストールできるでしょう。NumPyは、多次元配列(行列やベクトル等)の計算で力を発揮するライブラリなので、OpenCVやPillowと組み合わせて利用されます。
今回は、PILとnumpyを組み合わせて、test.pngを読み込んで、一部をトリミングして、test2.jpgで保存しましょう。
import numpy as np #必要なライブラリをインポートします。numpyは通常npと略して利用します。
print(img.shape)を実行すると、行列形式であることが、確認できます。トリミングをする場合は、読み込んだ行列をスライス領域で指定することで行えます。
Image.fromarray(img2).save(‘test2.jpg’)
これらを実行することで、画像のトリミングを実行することができます。
Pythonで画像処理を行うときの注意点
Pythonで画像処理を行うときの注意点をお伝えします。
今回は、OpenCV、Pillow(PIL)、NumPyライブラリを紹介しましたが、それぞれのライブラリ特徴があります。行いたい処理に基づいて、それぞれのライブラリを選択しましょう。
OpenCVは、処理速度が速く、単純な画像処理から高度な画像処理(特徴点抽出など)を行うことができることが特徴です。Pillow(PIL)は、Python Image Libraryの流れを汲んでいることから、単純な画像処理の操作が容易なことであることが特徴です。NumPyは、多次元配列の計算が得意であるため、画像の機械学習などを行う際に、OpenCVやPillowと組み合わせて利用することで強力な力を発揮します。このため、画像処理でどのタスクを行うかでライブラリが変わるので注意しましょう。
さて、今回はPythonを使った画像処理とPythonの画像処理を行うためのライブラリについてお伝えしました。ここで今回お伝えしたかった内容は以下となります。
- 画像処理とは、画像のトリミング(切り取り)や画像のリサイズ(拡大・縮小)など画像に加える処理
- Pythonの画像処理を行うライブラリは、OpenCV、Pillow(PIL)、NumPy
- OpenCVは、cv2としてライブラリをインポートして、様々な画像処理を行える
- Pillow(PIL)は、PILとしてライブラリをインポートして、画像処理を行うこと、PILとPillowは両方同時には使えない
- NumPyは、画像を多次元配列として処理を行う
- Pythonを用いて画像処理を行う際は、用途に応じて適切なライブラリを選択する
Pythonのライブラリを利用すると、画像処理を容易に行えます。これをきっかけにして様々なライブラリを用いて、Pythonの画像処理を始めてみましょう。
【お知らせ】
当メディア(AIZINE)を運営しているAI(人工知能)/DX(デジタルトランスフォーメーション)開発会社お多福ラボでは「福をふりまく」をミッションに、スピード、提案内容、価格、全てにおいて期待を上回り、徹底的な顧客志向で小規模から大規模ソリューションまで幅広く対応しています。
御社の悩みを強みに変える仕組みづくりのお手伝いを致しますので、ぜひご相談ください。