OpenCV、Pillowそれぞれでグレースケール変換
前回までは画像の回転について書いていきましたが、今回は色調についても触れていきたいと思います。 単純な画像はPillowの方が使いやすいのですが、今後機械学習などを使うことを考えるとOpenCVの使い方も覚えた方がよいと思いますので、両方のやり方を記述していこうと思います。
OpenCVを使う方法
コードの紹介
# インポート import cv2 # 画像ファイルの読み込み img = cv2.imread("Lenna.jpg") # グレースケールに変換 img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 読み込んだ画像の出力。 cv2.imshow('Lenna_gray', img_gray) # 何かのキーを入力待ちする。64bitのマシンの場合は「& 0xFF」が必要らしい cv2.waitKey(0) & 0xFF # ウィンドウを閉じる cv2.destroyAllWindows()
出力結果
その他の画像変換
VS Codeでcv2.color_bgrと打つと、候補がいろいろと出てきます。 いろいろな変換ができるようですが、この辺りはまだ無知なので割愛。。
少し解説
BGR2xxxはBGR(青、緑、赤)の色調をxxxに変える、という意味になります。BGR2GRAYであればBGRをグレースケールに変換、という意味です。 ここで注意なのは、OpenCVはRGBではなくBGRが基本になります。一般的にはRGBが多いので、少し厄介ですね。
Pillowを使う方法
コードの紹介
# インポート Pillow(PIL)の中のImageモジュールを使う from PIL import Image # 画像ファイルの読み込み img = Image.open("Lenna.jpg") # グレースケールに変換 img_gray = img.convert('L') # 表示 img_gray
出力結果
Pillowを使ってもっと自由に画像を回転
前回はOpenCVを使って画像を回転してみました。 ただ、回転は90度、180度、270度できないため、もっと自由に回転ができるPillowというライブラリを使ってみようと思います。
コードの紹介
# Pillowのインストール(初回のみ) !pip install pillow # インポート Pillow(PIL)の中のImageモジュールを使う from PIL import Image # 画像ファイルの読み込み img = Image.open("Lenna.jpg") # 時計回りに30度回転 img_30 = img.rotate(30) # 表示 img_30
出力結果
回転できましたね。ソースもrotate(角度)ととてもシンプルです。
その他rotateのオプション
全画面表示
rotate(角度)だけだと、画像の縦横サイズは変わりません。そのため、画像が切れてしまいます。以下のようにexpandオプションを入れることで全画面表示することができます。
img_30 = img.rotate(30, expand=1)
回転軸を変える
通常は画像の中心を軸にして回転します。以下のようにcenterオプションに座標を入れることで、回転軸を変えることができます。
img_30 = img.rotate(30, center=(0,0))
画像を移動させる
先ほどの画面で少し上に寄ってしまったため、translateオプションで画像をずらすことができます。以下はy軸を100ずらしています。
img_30 = img.rotate(30, center=(0,0), translate=(0,100))
背景色を変える
filcolorオプションでRGBを指定することで、背景色を変えることができます。
img_30 = img.rotate(30, fillcolor=(255,0,0))
OpenCVとPillow、どっち?
結局どちらを使うのが良いかですが、
OpenCV:動画や分析などに便利 OpenCVにはUSBカメラなどから動画を取得することも簡単にできます。また取得した画像は配列で取得できるため、そこから機械学習などデータ分析をすることも可能なので、AIアプリを作る、などには向いています。
Pillow:単純な画像変換 今回の回転など、画像をちょっといじる分にはPillowの方が向いています。
また回転以外の処理方法などについてもこれから挙げていこうと思います!
OpenCVで画像を回転(90度、180度、270度)
画像を回転するには、OpenCVのrotateを使います。
コードの紹介
# インポート(OpenCVを使うよ、という宣言) import cv2 # 画像ファイルの読み込み img = cv2.imread("Lenna.jpg") # 時計回りに90度回転 img_90 = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE) # 読み込んだ画像の出力。 cv2.imshow('Lenna_90rotate', img_90) # 何かのキーを入力待ちする。64bitのマシンの場合は「& 0xFF」が必要らしい cv2.waitKey(0) & 0xFF # ウィンドウを閉じる cv2.destroyAllWindows()
出力結果
画像を回転できました。
その他の角度で回転
どうもこのrotate関数、90度右回り、180度、90度左回り(270度右回り)しか対応していないようです。。
もう少し柔軟にできたらいいんですけどね。 また何か見つけましたら紹介したいと思います。
画像処理ライブラリのOpenCVをPythonで使う
今日は画像処理に取り組みます。
ライブラリについて
Pythonにはいくつものライブラリ(何かの処理をするためのまとまった関数のようなもの)が用意されていて、それをインストールするだけで様々な処理が簡単にできるようになります。
これがPython人気の理由の一つですね。
OpenCVのインストール
インストールの方法はいくつかありますが、pipというコマンドを使って、Jupyterでインストールします。
まずJupyterファイルを作ります。その前に、適当なフォルダを作り、「表示」→「ファイル拡張子」にチェックを入れておきましょう。
これってデフォルトでオフになってるんですよね。拡張子って何?っていう人向けに混乱させないようにしてるんでしょうけど、逆に混乱する気が・・・。
それはさておき、ウィンドウ上で、右クリック→新規作成→テキストドキュメントで、新しいファイルを作成します。
ファイル名を変更しましょう。ここでは「opencv.ipynb」としています。ファイル名は何でもよいですが、拡張子の.ipynbは間違えないようにしましょう。 拡張子変更してもよいか聞かれますので、「はい」と選択しましょう。
ファイルをダブルクリックで開くとVS CodeのJupyter Notebookが開きます。 ここで下記のように入力し、Shift+Enterで実行します。
!pip install opencv-python
pip install などのコマンドは通常コマンドプロンプトやPower Shellなどで実行するものですが、頭に「!」を入れるとJupyter Notebook上で実行ができます。
これでインストール完了です。
ついでにpipをアップグレード
結果を見ると「WARNING」とあり、pipに新しいバージョンがあると教えてくれます。 同じような要領で以下のように実行することでpipをアップグレードできます。
!pip install pip --upgrade --user
--upgradeオプションはインストールではなくアップグレードするよ、という意味。
--userはこのログインユーザの環境だけに適用する、という意味です。
--userをつけないとアクセス権がないとエラーになったためつけています。
OpenCVで画像を表示してみる。
事前に何かの画像をipynbファイルを入れたフォルダに入れておきます。今回は画像処理に有名なレナ画像を入れていますが、何でもよいです。
VS Codeに戻り、プログラムを入力します。単純に画像を表示するプログラムです。
# インポート(OpenCVを使うよ、という宣言) import cv2 # 画像ファイルの読み込み img = cv2.imread("Lenna.jpg") # 読み込んだ画像の出力。ウィンドウのタイトルを「Lennaさん」とする cv2.imshow('Lennaさん', img) # 何かのキーを入力待ちする。64bitのマシンの場合は「& 0xFF」が必要らしい cv2.waitKey(0) & 0xFF # ウィンドウを閉じる cv2.destroyAllWindows()
Shift+Enterで実行するとレナさんが表示されます。
ちなみにこのopencv、日本語には対応していないようです。
ですので、タイトルが文字化けしてしまいます・・・。
特にパスに日本語が入っているとエラーになるので注意して下さい。
少し解説
大体コメントアウトで書いている通りなのですが、 cv2.waitKey(0)の引数について少し触れます。 このwaitKeyの引数は、何ミリ秒待つかを指定できます。 例えばcv2.waitKey(5000)とすると、5,000ミリ秒=5秒だけ待ちます。 0にすると、無限に待ちます。つまり何かキーが入力されるまで待ち続ける、という仕組みにできます。
おわりに
いかがでしたでしょうか。文字化け問題は本当につらいですね。。日本人としては一生付き合わないといけないのかもしれません。
Jupyterより便利!?VS Codeで「#%%」
前回 VS Code+Jupyter Notebookを使ってPythonを動かす方法を紹介しました。これも非常に簡単にできるの ですが、もっと便利な方法がありましたので紹介します。
VS CodeでPythonファイル(.sh)を実行
「.sh」ファイルを作成
まずはファイルを作成します。VS Codeを開いて作成でもよいですし、フォルダ上に作成してファイルをVS Codeの画面にドラッグしてもよいです。
#%%を入力してみる
#%%と入力すると、Run Cell、Run Below、Debug Cellが出てきますね。
コードを書いて実行する
以下のように。続きを書いていきます。今回は処理を繰り返すfor文を使っています。
# %% for文の実行 a = 0 for i in range(5): a = a + i print(a)
range(5)は0,1,2,3,4と5回繰り返す、という意味になります。
まず1回目はiに0が入るため、a + i は0 + 0、つまり0がaに代入されます。2回目はiに1が入るため、a + i は0 + 1、つまり1がaに代入されます。
これらを繰り返して結果を出すのですが、まず実行して結果を見てみましょう。
実行方法はJupyter Notebookと同じShift + Enter(もしくはCtrl + EnterでもOK)です。
右側に実行結果が出てきました。
結果は0+1+2+3+4で10ですね
デバッグができて開発効率めちゃアップ!!
プログラムでよくあるのが、0始まりか1始まりか悩みます。
今回のrange(5)も、1,2,3,4,5かと思って1+2+3+4+5=15を期待していたら10?あれ?と思うことはよくあります。
今回は簡単な例なので、すぐ原因がわかりますが、長いプログラムになればなるほど原因を見つけるのって難しいですよね。
そんな時に便利なのがデバッグです。 これがこの#%%を使うやり方だと簡単にできるんです!
デバッグのやり方
Shift + Enterを押すと繰り返しも全部実行されて、最後の答しか出てこないです。 そのため、まず実行を途中で止めたい場所(ブレークポイント)をクリックしましょう。場所は行数が書かれている場所の左側です。
するとブレークポイントの個所で止まりました。しかも、a,iそれぞれにどんな値が入っているかが見て取れます。
続行ボタンを押してみましょう。(もしくはF5でもOK)
i が1に変わりましたね。今黄色で囲まれた a = a + i の前で止まっているので、これから0 + 1 をしますよ、というのがわかります。
続けて「続行」をクリックすると、今度は aには1、iには2が入ってることがわかります。これを繰り返していくと、なるほど、0+1+2+3+4をやってるなぁということが分かります。
ちなみに、左側の変数一覧から見る方法もありますし、プログラムの画面上の変数(たとえばfor i in ...の i )にカーソルを充てるとポップアップで表示させることもできます。
おわりに
いかがでしたでしょうか。やはりデバッグができるかできないかで、プログラムの不具合が起こった時の原因解決がめちゃめちゃ早くなるので、これは非常に便利なツールです。
これを無料で提供するマイクロソフト恐るべしですね。。
Visual Studio Code (VS Code) でPythonを動かす
今日はPythonのコーディングをさらに使いやすくするため、VS Codeを入れていきます。
なぜ入れた方が良いかも後ほど説明します。
VS Codeのインストール
VS Codeのダウンロードサイトから実行ファイルをダウンロードします。
ダウンロードされたexeファイルを実行し、指示通りに進めていきます。
いろいろ聞かれますが、特に何も変えずに「次へ」をクリックしていけばよいです。 しいて言えばデスクトップにアイコンを作成した方が便利、くらいでしょうか。
VS CodeにPython環境を構築する
VS Codeを起動したら、まず必要なモジュールを入れていきます。 下図の四角が4つ並んだもの(Extensions)をクリックします。
Popularの中に「Python」があると思うので、その横の「Install」をクリックします。 ない場合はSearch欄に「Python」と入力して検索しましょう。
あと必須ではないですが、「japanese」と検索すると日本語化するモジュールもインストールできます。こちらも入れておきましょう。
日本語化パッケージを入れた場合は再起動しろと言われますので、「Restart」から再起動します。
Pythonの実行
それではPythonを実行してみます。 実行の方法はこれもいろいろあるのですが、今回はJupyter Notebookを使う方法で行います。
「ファイル」→「新しいファイル」を選択し、「Jupyter Notebook」を選びます。
枠が出てきますので、そこにPythonコードを入れます。 前回と同じように、このように入れます。
あとはShift+Enterです。 初回のみipykernelのインストールを促されますので、流れに任せてインストールします。
結果が出てきました。
VS Codeを使う理由
いかがでしたでしょうか。結構簡単にPythonの開発環境が構築できたかと思います。 JupyterはAnacondaなど他の環境でも使うことはできますが、私がVS Codeをお勧めする理由はいろいろとあります。
起動が早い
いらちな性格のせいかもしませんが、結構大事なんですよね。純正のJupyterだとブラウザが起動されて準備が完了するまでに時間がかかり、やる気をそがれてしまいます。VS Codeは本当にサクサク動きます。
きれいに色分けしてくれる
変数や関数などの色分けが、地味なのですが見やすいです。
関数や変数など補完してくれる
これが一番のメリットだと思います。例えば「pri」まで入れると候補を出してくれて、あとはTabやEnterを押すだけで入力が完了します。 結構長い関数や、自分で作った長い変数などもあるとかなり入力の手間が省けますし、長いコードになってくると変数も多くなるので、候補が出てくるのは助かります。
また、関数は ( を入れたタイミングで関数の説明や入れる変数の説明が出てきます。関数の使い方って多すぎて全然覚えられないので、これもうれしいです。 (できればこれも日本語対応してほしいところ。。)
WindowsでPythonを使ってみる(超初級)
Pythonの環境構築に関して記述していきます。
Python環境の構築方法いろいろ
ひとえにPythonといっても、環境の作り方はいくつかあります。
1. Anacondaをインストール
大体の書籍やネットを見ると、この方法が書かれています。
【メリット】Python以外にもいろいろなツールがそろってる
【デメリット】容量が結構必要。少しとっつきづらい(個人的に)
2. Visual Studioをインストール
マイクロソフトが提供しているプログラムソフトです。
【メリット】Python以外にもC#、C++などいろいろなコードが使える
【デメリット】容量がかなり必要。PC性能が良くないとめっちゃ動作が重い。。
3. Pythonのみをインストール
【メリット】簡単に構築。動作サクサク
【デメリット】使いづらい
3.に加え、マイクロソフトが提供しているプログラミング用のエディタソフト(VSCode:Visual Studio Code)を入れる方法です。
【メリット】比較的簡単で動作サクサク。使いやすい。
【デメリット】今のところなし。いろいろしようと思うと1.2.でしかできないこともあるのかも。
ということで、このブログでは4.を前提に進めていきます。
Pythonのインストール
今日は4.の方法をとる準備として、3.Pythonのインストールを紹介します。
まずPythonの公式ページのダウンロードサイトに行き、「Download Python ...」からインストーラーをダウンロードします。
ダウンロードしたexeファイルを起動します。
「Add Python xxx to PATH」にはチェックを入れておきましょう。推奨ではないそうなのですが、PATHに入れないと何かと不便。。
チェックを入れたら、「Install Now」をクリックしましょう。
しばらくするとインストール完了画面が出ますので、「close」クリックで閉じましょう。 これでPythonの導入完了です。
Pythonを実行してみる
Pythonを起動するには、Windows標準で備わっているコマンドプロンプトもしくはPower Shellを立ち上げます。 個人的にはPower Shellの起動が遅いため、コマンドプロンプトの方が使いやすいです。
Windowsキーを押し、「cmd」と入力した後にEnterを押しましょう。 (もちろんメニューから探してクリックでもよいですが、上のやり方の方が圧倒的に早いです)
pythonと入力しEnterを押します。(インストール時の「Add Python xxx to PATH」にチェックを入れてないと、pythonが見つからない、とエラーになります。python.exeがあるフォルダに移動する必要があり面倒です。)
試しに、以下のように入力してEnterを押してみましょう。
print("hello")
helloと返ってきましたね。
複数入れることもできます。例えば、aという変数に3、bという変数に2を入れて、2つの掛け算を出す場合、
a=3 b=2 print(a*b)
実行すると、答えの「6」が返ってきます。