===== OpenCVで画像切り抜き =====
==== 開発環境 ====
Windows8.1\\
Python 3.5\\
Anaconda 4.4.0 (64-bit)\\
OpenCV 3
===== 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のPythonからの使用法
cv2モジュールをインポート
画像データはnumpyのarray(多次元配列)として格納されている
まず、Lenna.pngを、https://en.wikipedia.org/wiki/File:Lenna.pngからダウンロードしておきます。
{{:pasted:20171128-222846.png}}
ここでは、Lenna.pngを、C:/py/opencv3/ フォルダに保存したものとします。
{{:pasted:20171128-223007.png}}
Windowsのスタートボタンから、Anaconda Promptを開いて、以下のコードを入力して、Jupyter notebookを起動。
cd c:/py/opencv3/
jupyter notebook
以下のように、Lenna.pngがあるフォルダが表示されるので、画面右上の、New > Python 3 をクリックして、新しいipynbファイルを作成。
{{:pasted:20171128-223137.png}}
画面上の方の、「Untitled」をクリックして、「opencv3_cut」に変更
{{:pasted:20171128-223316.png}}
以下のコードを入力して、Shift + Enter
# cv2モジュールからのOpenCV関数へのアクセス例
# Lenna.pngを、https://en.wikipedia.org/wiki/File:Lenna.pngからダウンロードしておく
import cv2
img = cv2.imread('Lenna.png')
print(img.shape)
{{:pasted:20171128-224252.png}}
入出力の可視化\\
画像の入力は、cv2.imread() → numpy.ndarray型の画像データ
OpencCVの画像データの構造\\
カラー画像:(height x width x channels) の3次元配列\\
グレー画像:(height x width)の2次元配列
今回は、hight 512, width 512, channels 3のカラー画像ですので、(512, 512, 3)という結果になりました。
画像をグレースケールで読み込みたい場合は、cv2.imread('Lenna.png', 0)のように記載します。
# Lenna.pngを、https://en.wikipedia.org/wiki/File:Lenna.pngからダウンロードしておく
import cv2
# 画像をグレースケールで読み込み
gray = cv2.imread('Lenna.png',0)
print(gray.shape)
{{:pasted:20171128-224655.png}}
==== 画像データがnumpy配列である利点 ====
numpy, scipyなどの線形代数関数が、OpenCVでのプログラムでも使用可能\\
計算スピードが速い\\
scikit-learnやtensorflow, Chainerなどの、Pythonの統計的・機械学習ライブラリとの連携もよい
==== OpenCVのnumpy画像データの注意点 ====
numpyに慣れる必要あり
matplotlib, PIL, scikit-imageは、RGB画像で保持するのに対して、
OpenCVはBGR画像がデフォルト(matplotlibで描画するときにカラー変換が必要)
OpenCVの画像は全て numpy.uint8型のnumpy.array
例えば、scikit-imageでは、グレー画像はnumpy.float64型なので、注意。
===== OpenCV3でJupyter Notebook上で画像の表示 =====
まず、以下のコードをコピペして、Shift + Enterをします。
# 画像の可視化 with Matplotlib
# 簡単だが、各モジュールのカラー画像の保存方法に注意(RGBとBGR)
# matplotlibでJupyter Notebook内で画像表示するためのおまじない
# Jupyter Notebook内で、%をつけて特定のコマンドを入力する方法を、マジックコマンドという
%matplotlib inline
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('Lenna.png')
plt.imshow(img)
# これだと、色が明らかに変な風に表示されてしまう
以下のようになりますが、なんか変な色です。
{{:pasted:20171128-225428.png}}
これは、OpenCVの画像はデフォルトだとBGR画像であるため、matplotlib(こちらはRGB画像)で正しく表示するためには色変換が必要。
具体的には、cv2.cvtColor()関数を用います。
以下のコードを入力して、Shift + Enter.
%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)
ちゃんと普通の色合いになりました。
{{:pasted:20171128-225835.png}}
===== OpenCV3で画像の保存 =====
作成中
===== OpenCV3で画像の切り抜き =====
以下のコードを入力して、Shift + Enter.
%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)
# 新しい配列に入力画像の一部を代入
dst = cvimg[0:400, 70:270]
plt.imshow(dst)
以下のように、切り抜かれます。
{{:pasted:20171128-230751.png}}
==== ソースコード(途中) ====
このままだと、RGBとかBGRとか。。。あとで訂正予定。
{{:pasted:20170814-232549.png}}
==== 参考 ====
指定した人物の顔画像を自動収集するプログラムの公開と使い方\\
http://qiita.com/Umemiya/items/747934f18b00c026ce83\\
これ、すごい!
現役JDと学ぶ画像処理入門①〜openCV入門〜\\
https://lp-tech.net/articles/qEftT\\
=> 非常に分かりやすい、お勧め。
http://yori1029.hatenablog.com/entry/2017/01/15/012819\\
OpenCV(Python)で画像をトリミング
http://qiita.com/gollowars/items/fb664c66f9a69e8c5cac\\
OpenCVの基礎勉強 with Python
gollowars
2016年04月22日に更新
http://qiita.com/zaburo/items/5637b424c655b136527a\\
Matplotlibで画像を表示
20151227
http://d.hatena.ne.jp/moremagic/touch/20160817/1471427660\\
jupyter で opencv を試してみる
20160817