【Python入門】Pythonで画像処理をしてみよう!



【Python入門】Pythonで画像処理をしてみよう!

最近流行りの「レシート読み込みアプリ」や「自動運転車が行う画像認識」。
これらの最新技術も Python を使うと手軽に体験できますね。
Python初学者が知っておきたい画像処理のトピックスから基本プログラム、それからチョット高度な技術を使ったOCRプログラムなどをご紹介したいと思います。

OCR: Optical Character Recognition、画像内の文字をテキスト化

目次
  1. 【Python入門】Pythonで画像処理をしてみよう!
  2. 今時のPythonを使った画像処理
  3. ノンプログラムで画像処理(解析)を体験
  4. Pythonで画像処理(初級)
  5. Pythonで画像処理(中級)
  6. Pythonで画像内の文字をデータ化(OCR)
  7. まとめ

【Python入門】Pythonで画像処理をしてみよう!

今時のPythonを使った画像処理

image

画像処理、と聞いて頭に浮かぶことは何でしょうか?「サイズ変更」「データ圧縮」「ファイル形式の変更」「モザイクなどのフィルター加工」いろいろあると思います。

Pythonを使った画像処理は現在進行系で進んでおり、最近のトピックスを以下にご紹介。

【「ハイ、チーズ」で目を閉じた人がいても大丈夫な画像加工技術】
Facebookが取り組んでいるExGANsプロジェクトで、目を閉じた人の写真も目を開けたバージョンに変更できるという画像処理アプリ。機械学習で「人の目」を学習させて、画像加工に活かしていますね。
参考:Eye In-painting with Exemplar Generative Adversarial Networks (ExGANs)

【金融政策発表時の総裁の表情から市場予測】
こちらは Microsoft社の Emotion という解析プログラムを使って人の感情を8つに分類。学習済みのプログラムを使うことで直ぐにアプリ開発に取り組める特徴がありますね。Emotion自体は C# で書かれていますが、APIでPythonでも使えるようにソフト提供されています。
参考:ロイター

【交通事故対策(アメリカ、ユタ州)】
アメリカの地理情報システム会社の ESRI社が取り組んでいるプロジェクトで、機械学習を用いて交通事故を減らそうとしています。地図にプロットされた過去データを元に、道路曲線・天候・人口密度などから、どういったケースに事故が起きやすいかを学習。そうすることで「ドライバーに事故率が高まっている、気をつけて!」とメッセージを送ることができますね。解析には Python ライブラリの ArcPy や Scikit learn 、 XGBoost などを使用。
参考:Medium/Using Machine Learning to Predict Car Accident Risk

これ以外にも医療現場ではCTスキャンを画像解析し、腫瘍(がん)を見つけたり、農業ではきゅうりの仕分けを画像解析が手伝ったりと、もう人間の「目」と「脳」の一部をプログラムが担っているといっても過言ではないでしょう。

またこれからはプログラムなしでも画像を機械学習させて、画像解析やそれを使ったアプリ開発が進みそうです。Googleが開発してる「AutoML Vision」要注目ですね。

ノンプログラムで画像処理(解析)を体験

image

画像解析、というとデータセットに機械学習、テストと何かと手間に感じやすいもの。しかし、最近は便利なPython対応のプログラムも無料でリリースされています。基本的な画像解析であればプログラムなしでも出来たりしますので、以下に画像抽出(物体検出)できる YOLO をご紹介。

YOLO自体は C言語で書かれていますが、TensorFlowにYOLOの物体検出機能を移管することでPython環境下で YOLO が使えるように。Python でも手軽に物体検出が楽しめるというわけですね。今回は雰囲気を確認するために YOLO のデモのみをご紹介。以下のコマンドをコピペするだけで物体検出ができちゃいます。

【入力コマンド】

git clone https://github.com/pjreddie/darknet
cd darknet
make

wget https://pjreddie.com/media/files/yolov3.weights

./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg

いかがでしょうか?こちらは YOLO が事前に学習したデータを使って物体検出していておもしろいですよね。ラズパイや Webカメラへ搭載すると監視カメラや接客などいろいろ応用ができそうですね。

Pythonで画像処理(初級)

少しトーンを落として Python の画像加工の基礎的な技術も確認しておきます。これまでは外部開発の Python 画像解析ライブラリばかりでしたが、標準でも 2つのグラフィック系モジュールが搭載されています。

  • imghdr
  • colorsys

image

次に Python の画像加工で有名なライブラリ Pillow をご紹介。Pillow は、サイズ変更やフィルター加工など本格的な画像処理が可能。Webフレームワークで有名な Django 上でサムネイル作成する際などに使われていますね。以下にフォルダ内の JPEG ファイルすべてをサムネイル化する様子をご紹介します。

-- 上記画像のコード --

from PIL import Image
import glob, os

size = 150, 150

for infile in glob.glob("*.jpg"):
    file, ext = os.path.splitext(infile)
    im = Image.open(infile)
    im.thumbnail(size)
    im.save(file + "_thumbnail.jpg", "JPEG")
    im.show(file + "_thumbnail.jpg", "JPEG")

ネット検索で「pillow thumbnail」など Pillow を使ってサムネイルを作成するコードを探しても、Pillow の旧バージョンのコードばかりでうまく行きません。最新の Pillow 5.2 に対応したコードは上記になります。サイズやファイル形式などを変えて自分好みにカスタマイズしてみて下さい。

Pythonで画像処理(中級)

次に画像転用などを防ぐためにロゴ入りの画像を見かけるケースも少なくないと思います。参考までに「サイズ変更+ロゴ追加」のコードをご紹介。こちらは著書「退屈なことはPythonにやらせよう」を参考にしています。

-- 上記画像のコード --

import os
from PIL import Image

SQUARE_FIT_SIZE = 500
LOGO_FILENAME = 'logo.png'

logo_im = Image.open(LOGO_FILENAME)
logo_width, logo_height = logo_im.size

os.makedirs('LogoPlus', exist_ok=True)

for filename in os.listdir('.'):
    if not (filename.endswith('.jpg')) \
       or filename == LOGO_FILENAME:
        continue
    im = Image.open(filename)

    im.thumbnail((SQUARE_FIT_SIZE, SQUARE_FIT_SIZE))
    width, height = im.size

    print('ロゴ追加しました {}...'.format(filename))
    im.paste(logo_im, (width-logo_width, height-logo_height), logo_im)

    im.save(os.path.join('LogoPlus', filename))

画像のリサイズに加えてすべての画像にロゴも一瞬で追加してくれますので、何かと役立ちそうなプログラムですよね。

Pythonで画像内の文字をデータ化(OCR)

OCRソフトとして有名な Tesseract OCR と Pythonプログラムを用いると、いろいろな画像内に含まれる文字をデータ化できます。家計簿アプリや名刺アプリなどで使われている画像内の文字読み込みがこの類になりますね。

-- 上記画像のコード --

from PIL import Image
import pytesseract
img1 = Image.open('/media/oshimamasara/Data256GB3/Programming/python/img_edit/ocr-img.jpg')
img2 = Image.open('/media/oshimamasara/Data256GB3/Programming/python/img_edit/receipt.jpg')
text1 = pytesseract.image_to_string(img1)
text2 = pytesseract.image_to_string(img2)
print(text1)
print('\n------------------------\n')
print(text2)

整合性は・・・といった感じですが、これも機械学習を加えると整合性が高まる様子。OpenCVなどを使った事例が公開されていますね(参考)。日本語の OCR 精度も高まると、溜まりに溜まった書類の整理もできそう。

まとめ

今回は、Python + 画像処理 の可能性を知っていただくためにサンプルを多数紹介しました。 Python環境がある方は是非ご自身のパソコンで体感してみて下さい。私は、「これはタダ事ではない」と危機感を感じました。

画像解析や機械学習以前に「Pythonってどうやって実行するんだ?」「プログラムのコードってどうやって保存するんだ?」という方。一度 Python の基礎学習検討されてみませんか? CodeCampでは、「オンライン × マンツーマン」で効率的な学習サポートを提供していますよ。お金と時間はかかるかもしれませんが、学習を終える頃には違った世界、違った未来が見えてくると思います。

オシママサラ
この記事を書いた人
オシママサラ
\無料体験開催中!/自分のペースで確実に習得!
オンライン・プログラミングレッスンNo.1のCodeCamp