OpenCVによる画像変換の効果

# はじめに
　画像解析を実施するためにOpenCVを用いてデータの水増しをする。その前に、OpenCVによる画像変換の効果を画像で確認する。次回、データの水増しを実施する。

#OpenCVによる画像変換の効果
- 画像の取得

```python
import numpy as np
import cv2
img = cv2.imread("./CleansingData/img.jpg")
```
![img.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252172/28e08a7b-7279-4b58-4b3c-237437146796.jpeg)


- リサイズ

元の1/10の大きさにする。

```python
resize_img = cv2.resize(img,(img.shape[1] // 10, img.shape[0] // 10))

cv2.imwrite("CleansingData/resize_img.jpg", resize_img)
```
![resize_img.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252172/9414b52d-822f-0688-0ce7-b26ad6c47da7.jpeg)

- モザイク

リサイズで縮小した画像を元のサイズに戻すとモザイクがかかる。

```python
mosaic_img = cv2.resize(resize_img,(img.shape[1], img.shape[0]))

cv2.imwrite("CleansingData/mosaic_img.jpg", mosaic_img)
```
![mosaic_img.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252172/29845e01-003b-3dbd-25b8-d2d9ffc6a267.jpeg)


- 回転

45°回転する。関数の引数は次の表の通り

|関数|第一引数|第二引数|第三引数|
|:---|:---|:---|:---|
|getRotasionMatrix2D|回転軸の中心を決める|回転させる角度|倍率|
|warpAffine|加工する画像|変換行列|出力画像のサイズ|

```python
mat = cv2.getRotationMatrix2D(tuple(np.array([img.shape[1] / 2, img.shape[0] /2])), 45, 1)
rotation_img = cv2.warpAffine(img, mat, (img.shape[1], img.shape[0]))

cv2.imwrite("CleansingData/rotation_img.jpg", rotation_img)
```
![rotation_img.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252172/49735873-2d1f-35bf-e79c-002dacc820de.jpeg)


- 反転

flip関数の第二引数で反転の種類を選択する。
反転の仕方はflip関数の第二引数により変更できる。
第二引数の種類は次の表の通り。

|第二引数||
|:---:|:---|
|0|x軸を中心に左右反転|
|1|y軸を中心に上下反転|
|-1|両方の軸を中心に反転|

```python
flip_img1 = cv2.flip(img, 0)
flip_img2 = cv2.flip(img, 1)
flip_img3 = cv2.flip(img, -1)

cv2.imwrite("CleansingData/flip_img1.jpg", flip_img1)
cv2.imwrite("CleansingData/flip_img2.jpg", flip_img2)
cv2.imwrite("CleansingData/flip_img3.jpg", flip_img3)
```
![flip_img1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252172/5ea178f6-2914-272e-49ee-db9dcd2114f0.jpeg)
![flip_img2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252172/0c886021-b622-d507-d0be-a14fdfbde923.jpeg)
![flip_img3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252172/9e77c52e-b8f9-7daf-a60c-b799bffc0678.jpeg)


- 色調変換・色反転

cvtColor関数でBGR色空間をLab色空間に変換する。
bitwise関数で色反転する。

```python
cvt_img1 = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
cvt_img2 = cv2.bitwise_not(img)

cv2.imwrite("CleansingData/cvt_img1.jpg", cvt_img1)
cv2.imwrite("CleansingData/cvt_img2.jpg", cvt_img2)
```
![cvt_img1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252172/17403626-e047-56b1-728a-6c091051bb8b.jpeg)
![cvt_img2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252172/db79fbe5-de90-3c5f-2f9b-68c78dcd541d.jpeg)


- 閾値処理
 
threshold関数の第二引数を閾値として、これを超えた時に第四引数で与えた処理を行う。第三引数はmxValue。
処理の種類は次の表の通り。

|第四引数||
|:---|:---|
|THRESH_BINARY|閾値を超えるピクセルはmaxValueに、それ以外のピクセルは0にする|
|THRESH_BINARY_INV|閾値を超えるピクセルは0に、それ以外のピクセルはmaxValueにする|
|THRESH_TRUNC|閾値を超えるピクセルは閾値に、それ以外のピクセルは0にする|
|THRESH_TOZERO|敷地を超えるピクセルは変更せず、それ以外のピクセルは0にする|
|THRESH_TOZERO_INV|閾値を超えるピクセルは0に、それ以外のピクセルは変更しない|

```python
retval, thresh_img1 = cv2.threshold(img, 100, 255, cv2.THRESH_BINARY)
retval, thresh_img2 = cv2.threshold(img, 100, 255, cv2.THRESH_BINARY_INV)
retval, thresh_img3 = cv2.threshold(img, 100, 255, cv2.THRESH_TRUNC)
retval, thresh_img4 = cv2.threshold(img, 100, 255, cv2.THRESH_TOZERO)
retval, thresh_img5 = cv2.threshold(img, 100, 255, cv2.THRESH_TOZERO_INV)

cv2.imwrite("CleansingData/thresh_img1.jpg", thresh_img1)
cv2.imwrite("CleansingData/thresh_img2.jpg", thresh_img2)
cv2.imwrite("CleansingData/thresh_img3.jpg", thresh_img3)
cv2.imwrite("CleansingData/thresh_img4.jpg", thresh_img4)
cv2.imwrite("CleansingData/thresh_img5.jpg", thresh_img5)
```
![thresh_img1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252172/02646411-78b8-d76b-ffa6-c3681817b278.jpeg)
![thresh_img2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252172/e1a2a46a-a714-e9c3-2d53-73d91ddecc80.jpeg)
![thresh_img3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252172/82263561-4383-4f63-0998-df7dcc6538d3.jpeg)
![thresh_img4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252172/a8f74469-d703-dfd7-8c6d-6ce3cf6c517e.jpeg)
![thresh_img5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252172/da10ba0a-7e18-0dd2-e968-92186005b84b.jpeg)

- ぼかし

ガウシアンフィルタを用いて画像をぼかす。第二引数はカーネルサイズ。カーネルサイズはn×nでnは奇数。数値が大きいほどぼかしが強くなる。

```python
gauss_img = cv2.GaussianBlur(img, (51, 51), 0)

cv2.imwrite("CleansingData/gauss_img.jpg", gauss_img)
```
![gauss_img.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252172/d2a307c7-466b-234a-c301-413dc718d16b.jpeg)

- グレースケール

白黒画像にする

```python
gray_img = cv2.imread("./CleansingData/img.jpg", 0)

cv2.imwrite("CleansingData/gray_img.jpg", gray_img)
```
![gray_img.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252172/cbacbdc5-c106-66da-6a5f-03cabc7c57af.jpeg)

- ノイズ除去

カラー画像のノイズ除去と白黒画像のノイズ除去がある。
画像を拡大して元の画像と比較すると違いがわかる、かも。

```python
nois_color_img = cv2.fastNlMeansDenoisingColored(img)
nois_gray_img = cv2.fastNlMeansDenoising(gray_img)

cv2.imwrite("CleansingData/nois_color_img.jpg", nois_color_img)
cv2.imwrite("CleansingData/nois_gray_img.jpg", nois_gray_img)
```
![nois_color_img.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252172/a1625db6-e2c7-a69b-c152-3e03be0ea3c8.jpeg)
![nois_gray_img.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252172/3c694506-577c-7ab3-4a35-9aa19296c6a0.jpeg)

- 膨張・収縮

膨張はピクセルを中心にフィルタ内の最大値を中心の値に、収縮はその逆にする。フィルタは上下左右の４つと周囲８つがある。下記は周囲８つで実施している。

```python
filt = np.ones((3, 3), np.uint8)
dilate_img = cv2.dilate(img, filt)
erode_img = cv2.erode(img, filt)

cv2.imwrite("CleansingData/dilate_img.jpg", dilate_img)
cv2.imwrite("CleansingData/erode_img.jpg", erode_img)
```
![dilate_img.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252172/4de04658-7503-71bb-4f08-a2879913e91a.jpeg)
![erode_img.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252172/37a90aa9-14ec-99dc-b8c4-05554f0e23c0.jpeg)

#おわりに
　OpenCVによる画像変換の効果を確認できた。次回はこれらの方法でデータを水増ししていく。