pythonとopencvで画像処理をやる時に見るメモ

# この記事について
この記事は画像処理のメモ書きです。
あとで同じ処理を探しやすくするためにまとめていきます。

## 環境

python 3.7.6

使用パッケージ

```
opencv-python==4.2.0.32
numpy==1.18.1
matplotlib==3.1.3
```

### パッケージのimport

```python
import matplotlib.pyplot as plt
import numpy as np
import cv2
```

### 画像の読み込み

サンプル画像はお馴染みのものを使います。
![lena.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190554/5af765ad-e075-ba81-0397-ab1abcc5d5ff.png)

```python

# 画像の読み込み
img = cv2.imread("/home/jovyan/lena.png")

# 色の変換
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# 画像の表示
plt.imshow(img)
```

#### 出力結果

![ダウンロード (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190554/2c03cbc4-1e90-c50f-11e8-ed3aef421aad.png)

### 画像のサイズ確認

```python
# 画像のサイズを確認
height, width, channels = img.shape[:3]
print(f'縦幅　: {height}')
print(f'横幅 : {width}')
print(f'チャンネル : {channels}')
```

#### 出力結果
```
縦幅　: 512
横幅 : 512
チャンネル : 3
```

### グレースケール化

```python
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 
# 画像の表示
plt.imshow(img_gray, 'gray') # 'gray'を指定しないと色が正しく表示されない
```

#### 出力結果

|  通常時 |　色が異なる時  |
|---|---|
|![gray_img.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190554/90058e7d-95ca-3d1f-7fc6-0004b08c2fe3.png) |![bad_gray_img.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190554/47504938-55a2-dea0-f5cf-a45c5e33e6d2.png)  |3  |

### 画像のマージン
画像に余白を持たせる

```python
# 余白の幅を含めた画像のサイズを決める
padding_width = width + 100
padding_height = height +  100

# 貼り付け先の画像を作成
base_img = np.ones((padding_height, padding_width, 3), np.uint8)*[255,255,255]

# 位置を指定して画像を貼り付け
base_img[50:height+50, 50: width+50] = img

plt.imshow(base_img)
```

#### 出力結果

![ダウンロード (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190554/fd29c3e7-f2ba-2bce-b3ed-029df1fc1b48.png)


### 画像を縦に連結

`横の長さが同じである必要があります`
`チャンネル数が同じである必要があります`

```python
target_img = [img, img, img]
vertically_conectted_img = cv2.vconcat(target_img)
plt.imshow(vertically_conectted_img)
```

#### 出力結果

![ダウンロード (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190554/f315990c-be04-19f9-a011-d280c20f409f.png)


### 画像を横に連結

`縦の長さが同じである必要があります`
`チャンネル数が同じである必要があります`

```python
target_img = [img, img, img]
horizontally_conectted_img = cv2.hconcat(target_img)
plt.imshow(horizontally_conectted_img)
```

#### 出力結果

![ダウンロード (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190554/82ba3c98-e90d-24f9-ea8c-e865cd23c51a.png)

### 画像のサイズを変更

```python
height = img.shape[0]
width = img.shape[1]

# 2倍に拡大
double_size_img = cv2.resize(img , (int(width*2), int(height*2)))
plt.imshow(double_size_img)

# 半分に縮小
half_size_img = cv2.resize(img , (width//2, height//2))
plt.imshow(half_size_img)
```

#### 出力結果
![double_size_img.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190554/c341dc5e-5022-0000-f863-3a995fea6988.png)

![half_size_img.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190554/fbce8a7e-0c56-e2e4-44c3-d8549ac7a019.png)

### 画像の回転

```python
# 画像の中心を取得
center = (width // 2, height // 2)
#回転角を指定
angle = 90.0
#スケールを指定
scale = 1.0
#getRotationMatrix2D関数を使用
trans = cv2.getRotationMatrix2D(center, angle , scale)
#アフィン変換
rotate_img = cv2.warpAffine(img, trans, (width,height))
plt.imshow(rotate_img)
```

#### 出力結果
![rotate_img.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190554/8ab5ad33-ff85-4e4f-d70c-467a7d7cb5be.png)