Python+OpenCVで画像編集の練習1

TIFFファイルを読み込み、ユーザー入力された原点座標・傾きの直線を引きたい。Pythonを使って簡単にできるらしいのでトライしてみる。

環境

画処理ライブラリの選択

Pillow (PIL)とOpenCVが有名らしいが、どちらを使用したら良いのだろうか?調べてみると、Pillowは単なる画像処理ライブラリだがOpenCVは「コンピュータビジョン」用のライブラリらしい。重複する機能は多いものの、OpenCVの方が画処理機能が豊富らしい。極端な話、画像のカットやリサイズ、簡単なフィルタリング程度ならPillowを使い、最初から「コンピュータビジョン」 を扱いたいのならOpenCVのみを利用するというのもありとのこと。うーん悩む……。ただ今回は技術力を付けたいなーという勉強も兼ねているため、OpenCVにトライしてみることにする。

OpenCVの導入

Pythonのお勉強で記載した通り、Python環境はAnacondaによって導入している。このAnacondaにはOpenCVは含まれていないため別途インストールの必要がある。少し調べると最新のOpenCV Ver3系はPython3.6に対応していないらしく、Python3.5の仮想環境を作ったりと大変そうなのでビビりながら調査。

いくつかの方法があるらしいが、まずは以下のサイトを参考に導入。

conda-forgeチャンネルなるものを追加し、インストールするらしい。管理者権限でコマンドプロンプトを起動し、以下の通りコマンド入力。
$ conda config –add channels conda-forge
$ conda install opencv

OpenCV以外にもいくつかのライブラリのインストール・アップデートが実行されるらしい。

“ y ”を入力してインストール開始。全ライブラリをインストールした後は10分程度反応が無かったが、気付いたらコマンドプロンプトに復帰していた。

conda listでライブラリリストを表示し、OpenCV 3.3.0がインストールされていることを確認。

実際にPythonを起動してimportしてverを確認。

サンプルファイル

Lena!Lenaを使いたい。画処理界隈で知らない人は居ないであろう例のあの人。早速 “Lena TIFF” でggったら24bit colorのTIFFファイルが3秒で見つかったのでこれを使用することにした。

Python+OpenCV!

以下のサイトを参考に実装してみた。

取り敢えず画像を読み込んでみる

画像は.pyファイルと同じくAnaconda3のインストールディレクトリ(C:\Users\ユーザ名直下)に置いておいた。まずはライブラリのインポート。

# -*- coding: utf-8 -*-
import cv2
import numpy

OpenCVとNumPy。Python版OpenCVでは読み込んだ画像データはNumPy配列に格納されるらしく宣言の必要がある。UTF-8の記載はPython2系列で必要だったものらしく、今でもその名残で記載することが多いらしい。特に自分はUTF-8エンコードを忘れることが多く日本語の文字化けが多発したため明示的に記載しておいた。続いて画像の読み込み。

# 画像の読み込み
## 第1引数:読み込む画像のパス
## 第2引数:カラータイプ -1: RGBA, 0: グレースケール, 1: RGB
img = cv2.imread(‘lena_color.tiff’, 1)

コメントの通り、cv2.imread関数は引数で読み込み方法を指定することができる。RGBAとはアルファ・チャンネル(透明度)も含めた画像として読み込むということ。読み込んだ画像の画素値はNumPy配列に格納されるため、通常のNumPy配列と同様にprint関数で中身を確認できるらしい。やってみた。

# 読み込んだ画像の画素値表示
print(img)

画素値が表示された。取り敢えず画像の読み込みはクリア。

読み込んだ画像を表示させてみる

# 画像の表示
## 第一引数:ウィンドウ名
## 第二引数:表示する画像のNumPy配列
cv2.imshow(“img”, img)

実行の結果、ウィンドウは表示されるのだが画像の描画はなく、フリーズしてしまい途中でPythonが落ちてしまう……。調べた結果、スタック・オーバーフローにも同様の質問があり、何かしらのwaitを設けると良いとのこと。以下を追加して実行。

# キーが押されるまで画像を表示したままにする
## 第1引数:キーイベントを待つ時間 0: 無限, 0以上: 指定ミリ秒待つ
cv2.waitKey(0)

# 作成したウィンドウを全て破棄
cv2.destroyAllWindows()

表示できた!!後で聞いた話だが、wait入れないと画像表示されないのはOpenCVの仕様らしい(そんなの知らない)。

ウィンドウサイズを変更できるようにする

デフォルトでは画像サイズに合わせてウィンドウが固定表示されるためこれを可変にする。cv2.imread関数の後に以下を用意。

# ウィンドウの表示形式の設定
## 第1引数:ウィンドウを識別するための名前
## 第2引数:ウィンドウの表示形式
## cv2.WINDOW_AUTOSIZE:デフォルト。ウィンドウ固定表示
## cv2.WINDOW_NORMAL:ウィンドウのサイズを変更可能にする
cv2.namedWindow(“img”, cv2.WINDOW_NORMAL)

ウィンドウサイズが可変にできた。取り敢えず今日はここまで。