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’)
ディスカッション
コメント一覧
まだ、コメントがありません