ITや趣味など気軽に投稿しています。

【Python】OpenCVで画像を読み込む

今回から、Pythonで画像解析をやってみる。

おお、かっこよさそう!

いつも形から入るテック君にはちょうどいい題材かもしれんな。
画像解析用のライブラリはいくつかあるが、OpenCVを使った画像解析を紹介しよう。

OpenCVとは

OpenCVはインテルが開発し公開しているオープンソースの画像処理ライブラリです。現在も開発が続けられており、様々な言語で利用可能になっています。

また、OpenCVを利用した物体検知や人物検知のプログラムも多数公開されており、手軽に画像認識を楽しむこともできます。

OpenCVの開発自体はC++で行われているが、Python、Java、Javascriptをはじめとした様々な言語で使うことができる。

すごいな~

また、クロスプラットフォーム対応もしており、Windows、Linux、macOS、Android、iOSなど様々な環境で使うことができる。

なんて便利な!それだけ需要があるってことですね。

OpenCVのインストール

まずはOpenCVを自分の環境にインストールする必要がある。

#pipの場合
pip install opencv-python
pip install opencv-contrib-python

#Anacondaの場合
conda install -c conda-forge opencv

pipの場合はopencvではなくopencv-pythonとなることに注意してほしい。

opencvとopencv-contribは何が違うんですか?

opencv-pythonはmain(core)モジュールのみで、opencv-contrib-pythonはcontrib(extra)モジュールも含まれているところに違いがある。
基本的な操作のみであればopencv-pythonで事足りるだろう。

contribは豪華版ってことですね。

OpenCVの実践

OpenCVのインポート

まずはプログラムでOpenCVをインポートする必要がある。

ですね。import opencvでいいんですよね?

それだとエラーになってしまうからダメなのだよ。
OpenCVのインポートは import cv2とする必要がある?

import cv2

ななな、なぜ?

元々C言語で開発されており、その時にcvと呼ばれていたらしい。その後、C++で開発されるようになり、それがcv2と呼ばれ今でも使われている。らしい。

らしい?自信ないですね。

聞き伝えのため定かではない。ただ、現在のOpenCVはバージョン4が最新だが、依然としてcv2であるから、バージョンのことではないのは確かだ。

画像の読み込み

早速画像を読み込んでみよう。画像読み込みはcv2.imread()を使う。

import cv2

#画像の読み込み
img = cv2.imread("input/fox.jpg")

カラー画像は3次元配列として読み込まれ、グレースケールの画像は2次元配列として読み込まれる。この後説明するmodeを指定することで、カラー画像をグレースケールとして読み込むこともできる。

いろいろ読み込み方を指定できるわけですね

また、現在OpenCVでは以下フォーマットのファイルをcv2.imread()で読み込むことができる。

種類拡張子
Windowsビットマップ*.bmp, *.dib
JPEGファイル*.jpeg, *.jpg, *.jpe
JPEG2000ファイル*.jp2
Portable Network Graphics*.png
Portable image format*.pbm, *.pgm, *.ppm
Sun rasters*.sr, *.ras
TIFF ファイル*.tiff, *.tif
OpenCVで読み込めるファイル形式

mode

modeを指定することで、任意の形式で画像を読み込むことができる。

任意の形式って、そんな使い分けることあるんですか?

解析する内容や方法によって必要な情報の形式が変わってくる場合がある。
今はいろいろな読み込み方があるとだけ思っておけばよいだろう。

まずmodeの指定方法だが、cv2.imreadの引数として以下のように指定する。
cv2.IMREAD_GRAYSCALEがmodeだな。

import cv2

img = cv2.imread("input/fox.jpg", cv2.IMREAD_GRAYSCALE)

グレースケールで読み込むってことですね。

その通り。主なmodeを説明しよう。

mode説明
IMREAD_UNCHANGED画像ファイルの色や精度をなるべく維持して取り込む。
IMREAD_GRAYSCALE1チャネルのグレースケールとして読み込む。
カラー画像も1チャネルで読み込まれる。
IMREAD_COLOR_BGR3チャネルのカラー画像として読み込まれる。
グレースケール画像も3チャネルで読み込まれる。
cv2.imread()で指定可能なmode(一部)

3種類ですか?

いや、他にもいろいろあるが、この3つを押さえておけばまずはよいだろう。
興味があれば他も調べてみると良い。

教えてくれないんですね。

説明を始めると長くなるがよいかね?

うっ(なんか面倒くさそう)

まあ、今回はここまでにしよう。次回は読み込んだ画像をプログラム内で表示したり、ファイルとして保存する方法を紹介しよう。

ありがとうございました~~♪