目次

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からダウンロードしておきます。

ここでは、Lenna.pngを、C:/py/opencv3/ フォルダに保存したものとします。

Windowsのスタートボタンから、Anaconda Promptを開いて、以下のコードを入力して、Jupyter notebookを起動。

cd c:/py/opencv3/
jupyter notebook

以下のように、Lenna.pngがあるフォルダが表示されるので、画面右上の、New > Python 3 をクリックして、新しいipynbファイルを作成。

画面上の方の、「Untitled」をクリックして、「opencv3_cut」に変更

以下のコードを入力して、Shift + Enter

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

入出力の可視化
画像の入力は、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)

画像データが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)
# これだと、色が明らかに変な風に表示されてしまう

以下のようになりますが、なんか変な色です。

これは、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)

ちゃんと普通の色合いになりました。

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)

以下のように、切り抜かれます。

ソースコード(途中)

# original code from http://qiita.com/gollowars/items/fb664c66f9a69e8c5cac
# -*- coding: utf-8 -*-
# 作成中
import cv2, matplotlib
import numpy as np
import matplotlib.pyplot as plt
# Jupyterでインライン表示するための宣言
%matplotlib inline
# 画像の読み込み
image = cv2.imread('lena.jpg')
#original code from https://lp-tech.net/articles/qEftT?page=2
#画像の色空間を変換。(入力ファイル名、(出力ファイル名)、色空間の変換コード)
#cv2.COLOR_BGR2RGBはBGR to RGB (BGRからRGBに変換)という意味。BGR2GRAYなどとするとグレースケール(白黒画像)になる。
rgb_image = cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
#表示
print("./lena.jpg")
print(image.shape)
plt.imshow(rgb_image)
#plt.show()
# 画像の切り抜き(OpenCV)
x = 200
y = 180
width = 150
height = 120
dstImg = image[y:y+height,x:x+width]
#画像の色空間を変換。(入力ファイル名、(出力ファイル名)、色空間の変換コード)
#cv2.COLOR_BGR2RGBはBGR to RGB (BGRからRGBに変換)という意味。BGR2GRAYなどとするとグレースケール(白黒画像)になる。
rgb_image = cv2.cvtColor(dstImg,cv2.COLOR_BGR2RGB)
#表示
print("./trimming.png")
print(dstImg.shape)
plt.imshow(rgb_image)
#plt.show()
# 切り抜き画像を保存
cv2.imwrite('trimming.png',dstImg)
view raw OpenCV_trimming hosted with ❤ by GitHub

このままだと、RGBとかBGRとか。。。あとで訂正予定。

参考

指定した人物の顔画像を自動収集するプログラムの公開と使い方
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