Google Colaboratory上で画像処理を試す方法の紹介。Jupyter NotebookあるいはGoogle Colaboratoryを触ったことがある人向け。
Google Colaboratoryで画像処理を試すメリット
- 環境構築の必要がない。ブラウザがあればいつでもどこからでも試せる。iPadからでも!
- REPL形式で、途中の状態を確認したり書き換えたりしながら作業できる
- Pythonで書くので、APIサーバーなどの形に移植しやすい
そして、何より無料で使える。
新しいNotebookの作成

「NEW PYTHON 3 NOTEBOOK」を選ぶ。Python 2系はまもなくサポートが終了してしまうので、特別な理由がなければPython 3系を選ぶ。
画像をアップロードして表示する
処理したいファイルをアップロードする。Google Driveから読み込ませることもできるが、枚数が少ない、あるいは確認用に色々な画像を使いたい場合はfiles.upload()
を使ってブラウザからアップロードするのが便利。
from google.colab import files
uploaded_file = files.upload()

コードブロックを実行すると、アップロードフォームが表示される。適当な画像を選んでアップロードする。
files.upload()
の返り値には、アップロードしたファイルの情報が含まれるDictionaryが入っている。キーがファイル名になっているので、アップロードされたファイルのファイル名はnext(iter(uploaded_file))
で取得できる。
uploaded_file_name = next(iter(uploaded_file))
print(uploaded_file_name)
「CODE」ブロックを追加して、アップロードしたファイル名を確認してみる。

OpenCVを使って画像を読み込む。OpenCVでは画像は色が(現在では)一般的なRGBではなくBGRで扱われる。それだと後々不便なので、cvtColor
を使ってRGBに変換しておく。
import cv2
orig = cv2.imread(uploaded_file_name)
src = cv2.cvtColor(orig, cv2.COLOR_BGR2RGB)
読み込んだ画像をmatplotlib
を使って画面に表示する。画像はぱくたそから拝借。
from matplotlib import pyplot as plt
plt.imshow(src)

デフォルトの状態では、グリッドが表示される。グリッドを表示したくない場合は、plt.axis('off')
を指定して非表示にできる。
OpenCVの機能で加工してみる
blurred = cv2.blur(src, (20, 20))
plt.imshow(blurred)
blur
を使って、画像にブラーをかけてみる。

上のコードではブラーのサイズを20 x 20にしたが、違う値で試してみよう。

ブラーのサイズを100 x 100に変更して、左側の「Run Cell」ボタンを押して実行し直してみた。このように、処理の途中でパラメータを変更して再実行、すぐに実行結果を確認できるのはREPLならでは。これは便利。
OpenCVのドキュメントはここ
NumPyを使って画像処理をする
NumPyを使って、ピクセルを直接操作して画像処理してみる。NumPyを使っておくと、あとあと機械学習系のライブラリ(Tensorflowとか)を使って処理をしたくなった時に便利なので、ちょっと試しておこう。
import numpy as np
pixels = np.array(src)
pixels = 255 - pixels
plt.imshow(pixels)
PythonのOpenCVは内部的にNumPyのndarrayを使っているらしいので、読み込んだデータをそのままnp.array()
の引数に渡せばピクセルデータのndarrayを生成できる。
NumPy自体の使い方については省略するが、ここでは全てのピクセルのRGB値それぞれに対して255から引くことで色を反転させている。
処理結果はそのままplt.imshow
で表示できるから便利だ。

OpenCVで読み込んだ元データは24bit(uint8 * RGBの3チャンネル)、各チャンネルはuint8になっている。uint8では加工すると精度が落ちてしまうので、floatに変換する。
pixels = np.array(src, dtype = 'float32')
表示のタイミングでuint8
の配列に戻してやることを忘れずに。
plt.imshow(pixels.astype('uint8'))

まとめ
ブラウザ上で、REPL環境で画像処理をできるというのは、実際に試してみるととても快適で良い。