スポンサーリンク

Chainer用の画像処理メモ(0)初めてのOpenCV”import cv2”

画像を機械学習するために、画像の前処理で、画像処理をする必要がある。

OpenCVやPIL(pillow)を使うことになるが、OpenCVについて、リンクを列挙してみる。

Pyconjp 2014 OpenCVのpythonインターフェース入門
Masaki Hayashi, Published on Sep 28, 2014
https://www.slideshare.net/payashim/pyconjp-2014-opencv

→まずはこのスライドを写経してみる!

上記作者様によるGitHub
https://github.com/payashim/tutorial-opencv-python-pyconjp2014

なお、初めてのPIL(pillow)については以下にメモしました。

http://twosquirrel.mints.ne.jp/?p=20135

(環境)
Panasonic CF-RZ4
Windows 8.1 Pro
Anaconda 4.4.0
Python 3.5
Chainer 2.0

(0)ファイル構成

C:/py/ フォルダに、opencv3/ フォルダを作成し、Lenna.pngを、https://en.wikipedia.org/wiki/File:Lenna.png からダウンロードしておく。

Anaconda Promptを開いて、

cd C:/py/opencv3
jupyter notebook

とすると、WEBブラウザ(私の場合はChrome)が自動的に開かれるので、画面右上の「New」>「Python3」をクリック

以下のような画面になるので、画面上のUntitledをクリックして、適当な名前に変更しておく。

なお、今回は、pyconjp-2014-opencv という名前とした。

(1)cv2モジュールからのOpenCV関数へのアクセス例
# Lenna.pngを、https://en.wikipedia.org/wiki/File:Lenna.png からダウンロードしておく。
import cv2
img = cv2.imread('Lenna.png’)

を入力して、Shift + Enter

→パソコンのメモリ(?)に画像を読み込んでいるだけ。特に何も起こらない。

(2)OpenCVのPythonからの使用法

cv2モジュールをインポート
画像データはnumpyのarray(多次元配列)として格納されている

(3)入出力の可視化

画像の入力は、cv2.imread() → numpy.ndarray型の画像データ

(4)OpencCVの画像データの構造

カラー画像:(height x width x channels) の3次元配列
グレー画像:(height x width)の2次元配列

import cv2
img = cv2.imread('Lenna.png’)
print(img.shape)

import cv2
# 画像をグレースケールで読み込み
gray = cv2.imread('Lenna.png’,0)
print(gray.shape)

import cv2
# 画像を読み込み
img_src = cv2.imread('Lenna.png’)
#画像をカラー(BGR)からグレースケールへ変換
img_gray = cv2.cvtColor(img_src, cv2.COLOR_BGR2GRAY)
print(gray.shape)

(5)画像データがnumpy配列である利点

numpy, scipyなどの線形代数関数が、OpenCVでのプログラムでも使用可能
計算スピードが速い
scikit-learnやtensorflow, Chainerなどの、Pythonの統計的・機械学習ライブラリとの連携もよい

(6)OpenCVのnumpy画像データの注意点

numpyに慣れる必要あり
matplotlib, PIL, scikit-imageは、RGB画像で保持するのに対して、
OpenCVはBGR画像がデフォルト(matplotlibで描画するときにカラー変換が必要)
OpenCVの画像は全て numpy.uint8型のnumpy.array
例えば、scikit-imageでは、グレー画像はnumpy.float64型なので、注意。

(7)画像の可視化1 with OpenCV
# cv2.imshow() を用いる

import cv2
img = cv2.imread('Lenna.png’)
cv2.imshow('color image’, img)
# 上記だけだとWindows8.1の私の環境だとうまくいかないので、以下のコードを追加
# https://ja.stackoverflow.com/questions/31537/
cv2.waitKey(0)
cv2.destroyAllWindows()

→別Windowで、カラー画像が開かれる。

import cv2
img = cv2.imread('Lenna.png’)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow('gray image’, img_gray)
# 上記だけだとWindows8.1の私の環境だとうまくいかないので、以下のコードを追加
# https://ja.stackoverflow.com/questions/31537/
cv2.waitKey(0)
cv2.destroyAllWindows()

(8)画像の可視化2 with Matplotlib

# こっちの方が簡単だが、各モジュールのカラー画像の保存方法に注意(RGBとBGR)
# matplotlibでJupyter Notebook内で画像表示するためのおまじない
# Jupyter Notebook内で、%をつけて特定のコマンドを入力する方法を、マジックコマンドという
%matplotlib inline
import cv2
import matplotlib.pyplot as plt
plt.imshow(img)
# これだと、色が明らかに変な風に表示されてしまう

%matplotlib inline
import cv2
import matplotlib.pyplot as plt
# OpenCVの画像はデフォルトだとBGR画像であるため、
# matplotlib(こちらはRGB画像)で正しく表示するためには色変換が必要
# 具体的には、cv2.cvtColor()関数を用いる
cvimg = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(cvimg)

ここまでとする。

<OpenCV入門のリンク>

機械学習のためのOpenCV入門
icoxfog417
2016年05月23日に更新
https://qiita.com/icoxfog417/items/53e61496ad980c41a08e

2017年7月5日 更新
現役JDと学ぶ画像処理入門①〜openCV入門〜
https://lp-tech.net/articles/qEftT
→わかりやすい!おすすめです。

Python版OpenCV入門 サンプル集
2017/10/17
https://algorithm.joho.info/programming/python/opencv-sample-code-py/
→とってもわかりやすいです。辞書的な使い方もできます。

ネットサーフィンの壺
カテゴリ: OpenCV
http://blog.livedoor.jp/aiko_tech/archives/cat_90478.html

OpenCV-Python Tutorials
http://opencv-python-tutroals.readthedocs.io/en/latest/index.html

<NumPyについて>

Pythonの数値計算ライブラリ NumPy入門
12月 23rd, 2012
http://rest-term.com/archives/2999/

<PIL(pillow)について>

OpenCVはインストールがややこしいことがあります。pillowという、あらかじめAnacondaに入っているモジュールも、OpenCVと似たような画像処理を行うことができます。

PIL/Pillow チートシート 20170307
https://qiita.com/pashango2/items/145d858eff3c505c100a

2017-02-16 — Tag: Python / Pillow / Image Python, Pillowを使って画像を一括でリサイズ(拡大・縮小)する方法
https://www.outoutput.com/programming/python-pil-pillow-image-resize/

2015-04-30
PythonのPillowで画像処理
http://pc.atsuhiro-me.net/entry/2015/04/30/215643?amp=1

https://qiita.com/ttmsk/items/aad577f49cf4f203f03d
Pillowでグレースケールに変換するコードが記載されている。

from PIL import Image
img = Image.open('sample.png’)
gray_img = img.convert('L’)
gray_img.save('sample-gray.png’)