バックナンバーはこちら。
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)


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。
バックナンバーはこちら。
コメント