opencvの使い方

OpenCVは画像解析や機械学習によく利用される、コンピュータービジョンライブラリの一つです。基本的な画像変換だけでなく、画像のフィルター処理、顔認識、物体認識、オブジェクトトラッキングなど、実務でよく利用される機能が一通りそろっている非常に使いやすいライブラリになっています。実務で画像認識系の仕事をする際は必ず利用するライブラリになっています。

まずは基本的な使い方からです。

github

  • jupyter notebook形式のファイルはこちら

google colaboratory

  • google colaboratory で実行する場合はこちら

環境

筆者のOSはmacOSです。LinuxやUnixのコマンドとはオプションが異なります。

筆者の環境

!sw_vers
ProductName:	Mac OS X
ProductVersion:	10.14.6
BuildVersion:	18G95
!python -V
Python 3.5.5 :: Anaconda, Inc.
import cv2

print('opencv version :', cv2.__version__)
opencv version : 3.4.1

画像表示用にmatplotlibもimportします。画像はwebでの見栄えを考慮して、svgで保存する事とします。

%matplotlib inline
%config InlineBackend.figure_format = 'svg'

import matplotlib.pyplot as plt

上の階層に lena.jpg というファイルがあるとします。

%%bash

ls -al ../ | grep jpg
-rw-r--r--@  1 hiroshi  staff  8211 11 14 22:01 lena.jpg
filename = '../lena.jpg'

画像の読み込み

画像を読み込み、表示してみます。jupyter notebookの中で表示させるため、matplotlibを利用しています。

img = cv2.imread(filename=filename)

# OpenCVではGBRの準備で画像が読み込まれるが、JupyterNotebookではRGBで表示させる
rgb_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

plt.imshow(rgb_img)
plt.show()

画像情報の取得

画像の高さ、幅、カラーの場合の色の数(通常RGBの3)を確認します。

def get_image_info(img):
  if len(img.shape) == 3:
    img_height, img_width, img_channels = img.shape[:3]
    print('img_channels :', img_channels)
  else:
    img_height, img_width = img.shape[:2]

  print('img_height :', img_height)
  print('img_width :', img_width)

get_image_info(img=img)
img_channels : 3
img_height : 225
img_width : 225

画像の保存

imwriteメソッドを利用します。

out_filename = '../lena_out.jpg'
cv2.imwrite(out_filename, img)
True

グレースケール化

cv2.COLOR_BGR2GRAYを利用します。

gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

get_image_info(img=gray_img)

plt.imshow(gray_img)
plt.gray()
plt.show()

out_filename = '../gray_out.jpg'
cv2.imwrite(out_filename, gray_img)
img_height : 225
img_width : 225
True

白黒反転

グレースケールの画像を白黒反転させます。

bitwise_gray_img = cv2.bitwise_not(gray_img)

get_image_info(img=bitwise_gray_img)

plt.imshow(bitwise_gray_img)
plt.gray()
plt.show()

out_filename = '../bitwise_out.jpg'
cv2.imwrite(out_filename, bitwise_gray_img)
img_height : 225
img_width : 225
True

バイナリ化

グレースケールの画像から二値画像に変換します。

threshold = 120
ret, binary_img = cv2.threshold(gray_img, threshold, 255, cv2.THRESH_BINARY)

get_image_info(img=binary_img)

plt.imshow(binary_img)
plt.gray()
plt.show()

out_filename = '../binary_out.jpg'
cv2.imwrite(out_filename, binary_img)
img_height : 225
img_width : 225
True