PythonのOpencv 自分用メモ

PythonのOpencvを扱うときの 自分用メモです。
概要などは参考サイトを見てください。

## ファイル操作

### 画像読み込み時
cv2.imreadを使うことで画像を読み込むことができる。
**パスに注意。**

img = cv2.imread("ファイル名")
~~~md:Python
import cv2

img = cv2.imread("sample.jpg")
~~~

#### 読み込み確認

画像が存在するか確認したいときは、以下のように記述することで確認することができる。

~~~python:Python
import os

filepath = "sample.jpg"
print("カレントパス", os.getcwd())
print("filepath が指す絶対パス", os.path.abspath(filepath))
print("ファイルが存在するかどうか", os.path.isfile(filepath))
~~~

**結果**

```
カレントパス /Users/hogehoge/development/imgs
filepath が指す絶対パス /Users/hogehoge/development/imgs/sample.jpeg
ファイルが存在するかどうか True
```

### 画像書き込み
cv2.imwriteを使うことで画像を出力できる
cv2.imwrite('ファイル名', 出力するファイル)
~~~python:Python
import cv2

cv2.imwrite('sample.jpg', img)
~~~


## 画像操作
### 1920×1080のグレースケール画像を作成
np.zerosで配列の中身を0にする。
sizeが2×2なら、[[0 0][0 0]]のようになる
[参考サイト](https://www.higashisalary.com/entry/cv2-black-white-pic)
~~~python:Python
import cv2
import numpy as np
size=(1920, 1080)
# 配列の中身を0にする。uint8は符号なし8ビットの数値（256通り）
black_img=np.zeros(size, np.uint8)
cv2.imwrite('black.jpg', black_img)

# 白画像はcv2.imwriteの前に「white_img=black_img+255」を追加。
# cv2.imwrite('black.jpg',black_img) -> cv2.imwrite('white.jpg',white_img)に変更
~~~

### 1920×1080のカラー画像を作成
np.zerosで配列の中身を0にする。
sizeが2×2なら、  [[[0 0 0][0 0 0]][[0 0 0][0 0 0]]]のようになる
~~~python:Python
import cv2
import numpy as np
size=(1920, 1080, 3)
# 配列の中身を0にする。uint8は符号なし8ビットの数値（256通り）
black_img=np.zeros(size, np.uint8)
cv2.imwrite('black.jpg', black_img)
~~~

#### 画像の縦と横の長さ（サイズ）を求める。
20×60の画像を読み込んだ場合。
[参考サイト](https://www.mathpython.com/ja/opencv-image-size/)
~~~python:Python
import cv2
import numpy as np
img = cv2.imread(filename, 0)
height, width = img.shape[:2]

print(height)  # 20
print(width)  # 60
# (縦,横,チャンネル)
print(img.shape)  # (20, 60, 3)
# 縦*横*チャンネル
print(img.size)  # 3600
~~~

### RGB値を表示

[参考サイト](https://your-3d.com/python-rgb/)
~~~python:Python
import cv2
import numpy as np
img = cv2.imread("sample.jpg")
# 色配置の変換 BGR→RGB
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# numpyで扱える配列をつくる
img_array = np.asarray(img)
print(img_array[0, 0, :])
~~~
~~~結果
[255 255 255]＃R,G,B
~~~

### 生成した画像のBGR→RGB変換する関数
cv2.cvtColorを使ってBGR→RGB変換することができる。

~~~python:Python
import cv2

# 色配置の変換 BGR→RGB
black_img = cv2.cvtColor(black_img, cv2.COLOR_BGR2RGB)
~~~

#### ３次元配列の要素を入れ替えることでも実現できる。

~~~python:Python
import numpy as np

img_size = (16, 16, 3)
black_img = np.zeros(img_size, np.uint8)
#ここから変換
for i in range(len(black_img)):
    for j in range(len(black_img[i])):
        print(black_img[i, j])
        black_img[i, j, 0], black_img[i, j, 2] = black_img[i, j, 2], black_img[i, j, 0]
~~~
このように記述することで[[[128 0 0]][[0 0 128]]]から[[[0 0 128]][[128 0 0]]]のようになる。


## その他

### １６進数カラーコードからRGBに変換
ターミナルに背景色を表示させる
[参考サイト](https://teratail.com/questions/367204)
~~~python:Python
import matplotlib.colors as mcolors

color_rgb = tuple(int(c　*　255) for c in mcolors.to_rgb('#aa0000'))
print(color_rgb)
~~~

~~~md:結果
(170, 0, 0)
~~~

これをカラー画像に代入することにより色の変更ができる。

~~~python:Python
color_rgb = tuple(int(c　*　255) for c in mcolors.to_rgb('#aa0000'))
sample_img[0, 0] = color_rgb
~~~

### ANSIエスケープシーケンス
ターミナルに背景色を表示させる
~~~python:Python
str1 = "\033[48;5;"
# str2の「m  \」の空白が１バイトなら１バイト分背景色が変わる。
str2 = "m  \033[0m"
text = str1 + str(166) + str2 
print(text)
~~~