バックナンバーはこちら。
https://www.simulationroom999.com/blog/compare-matlabpythonscilabjulia3-backnumber/
はじめに
各ツール、各言語で画像の読み込み、処理、保存の基本的な記載の仕方を確認していく。
今回はPython。
登場人物
博識フクロウのフクさん
![指差しフクロウ](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん
![技術者太郎](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者01アップ.png)
イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
使用する画像再掲
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者02アップ.png)
今回はPythonかな?
まずは、使用する画像を再掲だね。
![](https://www.simulationroom999.com/blog/wp-content/uploads/2023/05/02_犬と自転車-1024x768.png)
ファイル名はdog.jpgとする。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
Pythonは画像の読み込みや書き出しに関する情報は多い。
まぁ、一応確認程度で実施する感じだな。
OpenCVのPythonパッケージのcv2を使用する。
以下でinstall可能なはずだ。
> pip install opencv-python
> pip install opencv-contrib-python
画像読み込み
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
まずは画像の読み込み
>>>import cv2
>>>im = cv2.imread('dog.jpg')
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者01アップ.png)
最初、cv2をimportして、それのimreadを使用するんだね。
流れとしてはMATLABと一緒か。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/考え中フクロウ.png)
ここに関してはPythonがMATLABをまねたというより、
OpenCVの仕様を両者が踏襲していると思った方が良いだろうな。
画像表示
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
次は読み込んだ画像の表示。
>>>cv2.imshow(im)
>>>cv2.waitKey(0) # これが無いと、表示Windowにイベントが行かない。
>>>cv2.destroyAllWindows()
![](https://www.simulationroom999.com/blog/wp-content/uploads/2020/04/Python_dog.png)
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」13アップ.png)
imshowで表示してるようだけど、
waitKeyっても必要になる?
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/お休みフクロウ.png)
コメントにも書いているが、画像を表示するWindow側にイベント通知が行かないので、これを入れ込むことで、
Python側はキー入力待ちで止まってもらう感じだな。
そして、キー入力後はdestroyAllWindowsで表示したWindowを破棄している。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者01アップ.png)
ここらへんはちょっとMATLABの時と事情が異なる感じだねー。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/お休みフクロウ.png)
Pythonならではの処理になるな。
画像処理
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
そして、赤の成分を抽出。
>>>im[:,:,(0,1)] = 0 # B(0番目)、G(1番目)の成分を0にする
>>>cv2.imshow('image',im)
>>>cv2.waitKey(0)
>>>cv2.destroyAllWindows()
![](https://www.simulationroom999.com/blog/wp-content/uploads/2020/04/Python_dog_red.png)
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」13アップ.png)
基本的にはMATLABと一緒っぽいけど、コメントを見るとBが0番目でGが1番目?
MATLABの時はRGBの順番だったような?
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/考え中フクロウ.png)
BRGの順番なのはPythonから呼び出しているOpenCVの仕様の影響だな。
じゃー、なぜOpenCVがBGRかについてはよくわからない。
昔はBGRが一般的であった、メモリ配置がリトルエンディアンであることの名残など諸説ある。
他のPython以外の環境だとRGBなことも多いから、ここらへんは注意が必要だ。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」20アップ.png)
気を付けるポイントがまぁまぁあるな・・・。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
そして、左右反転。
>>> im=im[:,::-1]
>>> cv2.imshow('image’,im)
![犬と自転車(左右反転)(Python)](https://www.simulationroom999.com/blog/wp-content/uploads/2023/06/02_犬と自転車左右反転Python.png)
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」13アップ.png)
MATLABの時に逆方向の等差数列の書き方が話題になったけど、
それと似たような書き方をしてるのかな?
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/考え中フクロウ.png)
似ているのだが、少し違う。
MATLABの場合、start:step:end
Pythonの場合、start:end:step
ちなみにPythonは等差数列を生成する書き方としては使えず、あくまで配列の要素の抜き出しに使用できる表現方法だ。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」10アップ.png)
stepとendが逆なのか?!
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/考え中フクロウ.png)
さらに、endに指定するindexの手前までしか処理されない。
例えば、startを5、endを0と指定すると、4~1の範囲が切り出される。
だからといって、endに-1を指定すると、-1は配列の終端要素からの逆順のindexを指示しているので期待した動作にならない。
これを回避するため、数値省略時の::は全体を示すという。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」09アップ.png)
ややこしすぎる!!
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/お休みフクロウ.png)
まぁ反転したいときは::-1にするって覚え方で良いと思うよ。
画像書き出し
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
次は、書き出し。
これはシンプルだ。
>>>cv2.imwrite("dog2.jpg",im)
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者01アップ.png)
これだけか。
MATLABと一緒だね。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/考え中フクロウ.png)
MATLABと一緒かというか、引数が逆なんで、そこ点は注意だな。
まぁ、間違ってもエラーになるだけだから、それほど気にしなくても良いだろうが。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」20アップ.png)
うーん、やっぱちょいちょい違うんだなぁ・・・。
まとめ
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
まとめだよ。
- Pythonで画像処理。
- OpenCVを利用するcv2パッケージが必要。
- 1ピクセルのRBGの並びがBGRになっている点に注意。
- 反転させる場合のスライシングは::-1。
バックナンバーはこちら。
コメント