LoginSignup
115
109

More than 5 years have passed since last update.

[Python]PythonでOpenCVを使う (基本編)

Last updated at Posted at 2016-03-01

インストール(Anaconda)

Anacondaで2016年2月現在最新のOpenCV3.1をインストールするには、下記のサイトから取ってくるようにする。

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

importしてバージョンを確認。

In [1]: import cv2

In [2]: print cv2.__version__
3.1.0

画像を読み込む

cv2.imreadで画像を読み込む。このとき画像はBGRになっている。
このままmatplotlibで表示しようとすると色がおかしくなるので注意が必要。

sckit kimageやscipyで画像を読み込むとRGBになる。

読み込んだ画像のタイプは、numpy arrayになっている。

In [5]: I = cv2.imread('Lenna.bmp')

In [6]: I = cv2.imread('lena512color.tiff')

In [7]: type(I)
Out[7]: numpy.ndarray

PILの場合

In [8]: from PIL import Image

In [9]: I = Image.open('Lenna.bmp')

In [10]: type(I)
Out[10]: PIL.BmpImagePlugin.BmpImageFile

Sckit Imageの場合

In [11]: from skimage import io

In [12]: I = io.imread('Lenna.bmp')

In [13]: type(I)
Out[13]: numpy.ndarray

In [14]: Icv = cv2.imread('Lenna.bmp')

In [15]: print Icv[0,0,:]
[125 137 226]

In [16]: print I[0,0,:]
[226 137 125]

Scypiの場合

In [17]: from scipy import misc

In [18]: I = misc.imread('Lenna.bmp')

In [19]: type(I)
Out[19]: numpy.ndarray

In [20]: print I[0,0,:]
[226 137 125]

matplotlibの場合

In [21]: from matplotlib import image

In [22]: I = image.imread('Lenna.bmp')

In [23]: type(I)
Out[23]: numpy.ndarray

In [24]: print I[0,0,:]
[226 137 125]

画像を保存する

opencvで画像を保存する場合は、imwriteを使用する。

imwrite(filename, img[, params])

In [26]: cv2.imwrite('output.png', I)
Out[26]: True

ただし、OpenCVで保存する場合は、Interleaved形式で、BGRの順番に色が並んでいないといけない。
そのまま保存すると下記のようになる。

output.png

画像を表示する

画像の表示は、imshowを使う。

imshow(winname, mat)

import cv2

I = cv2.imread('./data/SIDBA/Lenna.bmp')

cv2.namedWindow('window')
cv2.imshow('window', I)
cv2.waitKey(0)
cv2.destroyAllWindows()

ただし、これをinteractiveなipythonでやるとipythonが死亡する。

ipythonでやる場合は、下記のようにstartWindowThreadを最初に実行するとよい。

In [7]: I = cv2.imread('./data/SIDBA/Lenna.bmp')

In [8]: cv2.startWindowThread()
Out[8]: 1

In [9]: cv2.namedWindow('window')

In [10]: cv2.imshow('window', I)

In [11]: cv2.waitKey(0)
Out[11]: 10

In [12]: cv2.destroyAllWindows()

ただ画像を表示させたい場合は、特別な理由が無い限りmatplotlibを使った方が楽。

In [12]: import matplotlib.pyplot as plt
    ...: import cv2
    ...: 
    ...: I = cv2.imread('./data/SIDBA/Lenna.bmp')
    ...: 
    ...: plt.imshow(cv2.cvtColor(I, cv2.COLOR_BGR2RGB))
    ...: plt.show()

範囲を選択_036.png

色変換

opencvで画像を読み込んだ場合は、画像がBGRになっているので、matplotlibで表示するにはRGBに変換する必要がある。
このようなときにはcvtColorを使う。

import numpy as np
import cv2
import matplotlib.pyplot as plt

I = cv2.imread('./data/SIDBA/Lenna.bmp')

J = cv2.cvtColor(I, cv2.COLOR_BGR2RGB)

plt.imshow(J)
plt.show()
115
109
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
115
109