MATLAB,Python,Scilab,Julia比較 第3章 その4【画像操作③】

MATLAB,Python,Scilab,Julia比較 第3章 その4【画像操作③】 数値計算
MATLAB,Python,Scilab,Julia比較 第3章 その4【画像操作③】

バックナンバーはこちら。
https://www.simulationroom999.com/blog/compare-matlabpythonscilabjulia3-backnumber/

はじめに

各ツール、各言語で画像の読み込み、処理、保存の基本的な記載の仕方を確認していく。
今回はPython。

登場人物

博識フクロウのフクさん

指差しフクロウ

イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1

エンジニア歴8年の太郎くん

技術者太郎

イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1

使用する画像再掲

太郎くん
太郎くん

今回はPythonかな?
まずは、使用する画像を再掲だね。

ファイル名はdog.jpgとする。

フクさん
フクさん

Pythonは画像の読み込みや書き出しに関する情報は多い。
まぁ、一応確認程度で実施する感じだな。
OpenCVのPythonパッケージのcv2を使用する。
以下でinstall可能なはずだ。

> pip install opencv-python
> pip install opencv-contrib-python

画像読み込み

フクさん
フクさん

まずは画像の読み込み

>>>import cv2
>>>im = cv2.imread('dog.jpg')
太郎くん
太郎くん

最初、cv2をimportして、それのimreadを使用するんだね。
流れとしてはMATLABと一緒か。

フクさん
フクさん

ここに関してはPythonがMATLABをまねたというより、
OpenCVの仕様を両者が踏襲していると思った方が良いだろうな。

画像表示

フクさん
フクさん

次は読み込んだ画像の表示。

>>>cv2.imshow(im)
>>>cv2.waitKey(0)	# これが無いと、表示Windowにイベントが行かない。
>>>cv2.destroyAllWindows()
太郎くん
太郎くん

imshowで表示してるようだけど、
waitKeyっても必要になる?

フクさん
フクさん

コメントにも書いているが、画像を表示するWindow側にイベント通知が行かないので、これを入れ込むことで、
Python側はキー入力待ちで止まってもらう感じだな。
そして、キー入力後はdestroyAllWindowsで表示したWindowを破棄している。

太郎くん
太郎くん

ここらへんはちょっとMATLABの時と事情が異なる感じだねー。

フクさん
フクさん

Pythonならではの処理になるな。

画像処理

フクさん
フクさん

そして、赤の成分を抽出。

>>>im[:,:,(0,1)] = 0	# B(0番目)、G(1番目)の成分を0にする
>>>cv2.imshow('image',im)
>>>cv2.waitKey(0)
>>>cv2.destroyAllWindows()
太郎くん
太郎くん

基本的にはMATLABと一緒っぽいけど、コメントを見るとBが0番目でGが1番目?
MATLABの時はRGBの順番だったような?

フクさん
フクさん

BRGの順番なのはPythonから呼び出しているOpenCVの仕様の影響だな。
じゃー、なぜOpenCVがBGRかについてはよくわからない。
昔はBGRが一般的であった、メモリ配置がリトルエンディアンであることの名残など諸説ある。
他のPython以外の環境だとRGBなことも多いから、ここらへんは注意が必要だ。

太郎くん
太郎くん

気を付けるポイントがまぁまぁあるな・・・。

フクさん
フクさん

そして、左右反転。

>>> im=im[:,::-1]
>>> cv2.imshow('image’,im)
犬と自転車(左右反転)(Python)
太郎くん
太郎くん

MATLABの時に逆方向の等差数列の書き方が話題になったけど、
それと似たような書き方をしてるのかな?

フクさん
フクさん

似ているのだが、少し違う。
MATLABの場合、start:step:end
Pythonの場合、start:end:step
ちなみにPythonは等差数列を生成する書き方としては使えず、あくまで配列の要素の抜き出しに使用できる表現方法だ。

太郎くん
太郎くん

stepとendが逆なのか?!

フクさん
フクさん

さらに、endに指定するindexの手前までしか処理されない。
例えば、startを5、endを0と指定すると、4~1の範囲が切り出される。
だからといって、endに-1を指定すると、-1は配列の終端要素からの逆順のindexを指示しているので期待した動作にならない。
これを回避するため、数値省略時の::は全体を示すという。

太郎くん
太郎くん

ややこしすぎる!!

フクさん
フクさん

まぁ反転したいときは::-1にするって覚え方で良いと思うよ。

画像書き出し

フクさん
フクさん

次は、書き出し。
これはシンプルだ。

>>>cv2.imwrite("dog2.jpg",im)
太郎くん
太郎くん

これだけか。
MATLABと一緒だね。

フクさん
フクさん

MATLABと一緒かというか、引数が逆なんで、そこ点は注意だな。
まぁ、間違ってもエラーになるだけだから、それほど気にしなくても良いだろうが。

太郎くん
太郎くん

うーん、やっぱちょいちょい違うんだなぁ・・・。

まとめ

フクさん
フクさん

まとめだよ。

  • Pythonで画像処理。
  • OpenCVを利用するcv2パッケージが必要。
  • 1ピクセルのRBGの並びがBGRになっている点に注意。
  • 反転させる場合のスライシングは::-1。

バックナンバーはこちら。

コメント

タイトルとURLをコピーしました