ユーザ用ツール

サイト用ツール


初めてのopencv3

初めてのOpenCV3

Chainerで自前の画像データで機械学習を行う場合、

  1. 画像を収集して分類して保存(なるべくjpgファイルで収集)
  2. 画像をグレースケール化(カラーのままのこともある)
  3. 画像をリサイズ
  4. chainerの、tuple_datasetで使用できる形に変換

などの操作が必要であり、その過程が私のような初心者には難しい。

画像のリサイズなどは、OpenCV3というモジュールで行うと、比較的簡単にできるらしいので、OpenCV3(with Python)について学んでいきたいと思います。

開発環境

Windows8.1

Python 3.5

Anaconda 4.4.0 (64-bit)

Chainer 2.0

OpenCV3をWindows8.1にインストール

2017/8月時点で、Python3.5であれば、Anaconda Promptで、

conda install -c https://conda.anaconda.org/menpo opencv3

で、OpenCV3をインストール可能です。

python3.6の場合については、WindowsにOpenCV3をインストールをご覧ください。

インストール後にOpenCV3を試してみる

(作成中)

初めてのOpenCV_with_Python

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

をご覧ください。

Image.sizeとnp.array.shape

PILのImage.sizeは、画像の横幅(width:幅)と縦幅(height:高さ)を返します。

from PIL import Image
import numpy as np

# 画像の読み込み
img = Image.open('cat.jpg')

# 画像の幅と高さを取得
width, height = img.size
print(img.size)
print(width)
print(height)

# 元の画像と同じサイズのImageオブジェクトを作成する
img2 = Image.new('RGB', (width, height))

# img2をcat2.jpgという名前で保存する
img2.save(‘cat2.jpg’)

cv2(OpenCV)の場合

cv2.imreadで画像を読み込む。このとき画像はBGRになっている。

OpenCVで読み込んだ画像のタイプはnumpy arrayになっているため、画像の縦横を調べるときは、Numpyのshapeメソッドを用いる。

%matplotlib inline
import cv2
import matplotlib.pyplot as plt

img = cv2.imread(‘cat.jpg’)

print(img.shape)

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

Numpyのnp.array.shapeは、行列の行(height:縦に並んだ要素の個数)と列(width:横に並んだ要素の個数)を返します。

import numpy as np
a = np.arange(60).reshape(10, 6)
# 配列の形
a.shape

# 要素数
a.size

# 行数、列数の取り出し
# 画像をNumpy配列に変換したときは、以下を
# height, width = a.shape
# と書くことがある
nrow, ncol = a.shape
print(nrow)
print(ncol)


sizeとshapeで、widthとheightの順番が逆になりますので、注意が必要です。

PILとNumpyの組み合わせ

以下は、NumPy配列の扱いとなります。

from PIL import Image
import numpy as np

# グレースケール画像にしてからNumpy配列に変換
im  = np.array(Image.open('img.jpg').convert('L'))
print(im.shape)
print(im.dtype)
print(im)

# カラー画像のままNumpy配列に変換
im  = np.array(Image.open('img.jpg'))
print(im.shape)
print(im.dtype)
print(im)

Chainer用の画像処理メモ(4)pythonでの画像の操作 “from PIL import Image”

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

Chainer用の画像処理メモ(5)初めてのNumPy“import numpy as np”

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

[OpenCV Python]画像の幅、高さ、チャンネル数、depth取得
atinfinity edited this page on 27 Jul 2016

https://github.com/atinfinity/lab/wiki/%5BOpenCV-Python%5D画像の幅、高さ、チャンネル数、depth取得

PythonとOpenCVで画像処理②【ウィンドウ、画像のサイズ変更】


http://rasp.hateblo.jp/entry/2016/01/22/230852

Python – NumPyで画像を配列として取得する

https://endoyuta.com/2015/09/27/python-numpyで画像を配列として取得する/

初めてのPython画像処理

https://qiita.com/uosansatox/items/4fa34e1d8d95d8783536

2017-02-16 — Tag: Python / Pillow / Image
Python, Pillowを使って画像を一括でリサイズ(拡大・縮小)する方法

https://www.outoutput.com/programming/python-pil-pillow-image-resize/

2017-01-25 — Tag: Python
Pythonでファイル名の前後に文字列や連番を加えて一括で変更

https://www.outoutput.com/programming/python-os-rename-glob-format-basename-splitext/

参考文献

Pyconjp 2014 OpenCVのpythonインターフェース入門

Masaki Hayashi,Published on Sep 28, 2014

https://www.slideshare.net/payashim/pyconjp-2014-opencv

→わかりやすいです。コードがPython2, OpenCV2なので、一部動かないことがありそうなので、Python3, OpenCV3のコードに少しだけ変換したものを、上記リンクに記載しました。

jupyter notebookでOpenCV 3.1を動かす(2)
データ解析
2017/05/07

http://takacity.blog.fc2.com/blog-entry-142.html

→jupyter notebookでcv2で画像をインライン表示する場合は、

%matplotlib inline
import matplotlib.pyplot as plt

として、利用します。RGBとBGRに注意しながら、コードを記載します。

OpenCVで画像の読み込みと表示、保存20160216

http://rabbitfoot141.hatenablog.com/entry/2016/02/06/123859

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/

http://pc.atsuhiro-me.net/entry/2015/04/30/215643?amp=1

リンク

初めてのopencv3.txt · 最終更新: 2018/10/07 by 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki