OpenCVを用いた画像処理の基礎【まとめ】Python

opencvをimportして使えるようにする

```python:
import cv2
import numpy as np
from matplotlib import pyplot as plt
```
・Opencvによる画像の読み込み

```python:opencvによる画像の読み込み
img = cv2.imread('apple-picuture.jpg')
```

・OpenCVによって扱われる画像はnumpyアレーで(高さ、横幅、カラー)の順に格納されている

```python:
img = cv2.imread('apple-picuture.jpg')
img.shape
>>>(320,320,3)
```

・OpenCVによって扱われる画像はBGRの順番で画素値が格納されている

```python:
img = cv2.imread('apple-picuture.jpg')
img[0][0]
>>>(121,23,56) (Blue,Green,Red)の順番
```
・OpenCVによる画像の表示
画像が表示されたらその画像をクリックしてどこかのキーボードを入力するとウィンドウが閉じます

```python:
# 画像を表示する
img = cv2.imread('apple-picuture.jpg')
cv2.imshow('image',img)

# キーボード入力を待つ
cv2.waitKey(0)

# すべてウィンドウを閉じる
cv2.destroyAllWindows()
```
・OpenCVによる画像の保存
今回はtest.jpgという名前で同じ階層に画像を保存
うまくいくとTrueと出力される

```python:
img = cv2.imread('apple-picuture.jpg')
# osをimport
import os
#画像の保存
cv2.imwrite('test.jpg',img)
>>>True
```
・OpenCVによるリサイズ

```python:
img = cv2.imread('apple-picuture.jpg')
img_resize = cv2.resize(img,(160,200))
img_resize.shape
>>>(200, 160, 3) (高さ,横幅,チャンネル数)
```
・OpenCVによるリサイズの引数について
cv2.resize()の引数は以下のようになっています
cv2.resize(src, dsize, fx, fy, interpolation)
fx,fyは画像を何倍にするのかを表します
例えば縦を１.５倍、横幅を2倍にするならば①のようになります
interpolationはデフォルトでINTER_LINEARになっていますが他にも
・INTER_NEAREST – 最近傍補間
・INTER_AREA – ピクセル領域の関係を利用したリサンプリング。画像を大幅に縮小する場合、モアレを避けることができる手法
などがあります②

```python:リサイズの引数について
img = cv2.imread('apple-picuture.jpg')
#①
img_resize = cv2.resize(img,(img.shape[0],img.shape[1]),1.5,2)
>>>(480,640,3) 元は(320,320,3)

#②　サイズは元のまま
img_area = cv2.resize(img,(320,320),interpolation=cv2.INTER_AREA)
```

・グレースケールへの変換
通常画像は３チャンネルのRGBで表されますが、グレースケールでは1チャンネルで表されます。
メリットとしては演算が3分の1になることや、2値化がやりやすいということです
ちなみにグレースケールは以下のような計算式になっています
Gray = 0.2989R + 0.5870G + 0.1140B

```python:グレースケールへの変換
#1つ目
img = cv2.imread('apple-picuture.jpg')
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#補足（HSVへの変換）
img_hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

#2つ目(画像を読み込むときに2つ目の引数に0を入れるだけ)
img = cv2.imread('apple-picuture.jpg',0)
```
・ヒストグラム均一化
ヒストグラム均一化によって画像をより明暗をはっきりとした画像に変換できます
今回はグレースケールで表された画像に対してヒストグラム均一化を行っています
cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])
channnels : グレースケールの場合は0
histSize : ビンの数を表していて、全画素値を対象とするのであれば [256] を指定します．
ranges : ヒストグラムを計測したい画素値の範囲を表す RANGE です．通常は [0,256] を指定します

```python:ヒストグラム均一化
img = cv2.imread('apple-picuture.jpg',0)
hist = cv2.calcHist([img],[0],None,[256],[0,256])
```
・γ（ガンマ）変換
γ変換とは画像の明るさの変換方法のこと
__Y =  255 x ( Y ÷ 255)( 1 / γ)__
これが__γ変換の式__になっており
γが１の時は　Y=x　となり直線（下記の画像の１）
__γが大きくなれば明るい画像、小さくなれば暗い画像になります__
<img width="８0%" src="https://camo.qiitausercontent.com/b35929ca516fdecb080f978ffe59ee227744f796/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3138393937382f31393936393734662d383563322d373632352d646437372d6662623135333538623539392e706e67">

```python:ヒストグラム均一化
img = cv2.imread('apple-picuture.jpg',0)
def create_gamma_img(gamma, img):
  gamma_cvt = np.zeros((256,1), dtype=np.uint8)
  for i in range(256):
    gamma_cvt[i][0] = 255*(float(i)/255)**(1.0/gamma)
  return cv2.LUT(img, gamma_cvt)
```

・２値化
２値化とはある閾値を越えると255,小さいと0という風にして画像をモノクロにする手法です。
1つ目は通常使われる２値化の方法で、retには閾値が格納されています
2つ目は相対的に明るいか暗いかを判断して２値化してくれる方法です

```python:２値化
img = cv2.imread('apple-picuture.jpg',0)
#1つ目
ret , img_0 = cv2.threshold(img,0,255,cv2.THRESH_OTSU)
#2つ目
img_ada = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,3,1)
```