七沢みあさんの顔が(ﾉ´□｀)ﾉ　ノイズ処理を施して本来の美顔へ

#はじめに
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/fd49b021-a067-72ea-2f8f-fe722e6efe20.jpeg" class="img" alt="七沢みあノイズ">

**七沢みあさんって可愛いですよね。**

「あれ？」
「いつもと違うな。おかしい…」


拡大してみると…

なにか**白と黒の点のゴマ塩のようなもの**が紛れ込んでませんか？

これではかわいい顔に集中できません。

**平滑化**を施し**黒と白の点を除去**しましょ！




#平滑化とは？
**画像をぼかす**ということです。
OpenCVが用意しているのは4種類のぼかし方(フィルタ)が存在します。


- 1:移動平均フィルタ（平均化フィルタ）

- 2:ガウシアンフィルタ

- 3:中央値フィルタ

- 4:バイラテラルフィルタ


<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/2740c810-b388-309a-10e1-f2899dd46e84.png" class="img" alt="データ">   

**【注意】**
・「明度」は、単に色の彩度を下げたもの。
・「輝度」は、色による明るさの違いを考慮したもの。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/294c0f59-bc40-7fae-868d-eaf70c39b925.png)
**ex)青（R:0 G:0 B:255）の場合**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/d896855d-6c1f-c508-fafa-9f5e900ad0b8.png)



#1:移動平均フィルタ（平均化フィルタ）


<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/17974b09-73dd-468a-bff3-3b43ed93ff31.png" class="img" alt="データ">


<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/13e414a6-c152-7197-ec93-8f1194bcd0fa.png" class="img" alt="データ">


```py
#blurとは「ぼかし」という意味。
img = cv2.imread("nana.jpg")#openCVで画像ファイルを読み込み
img_blur = cv2.blur(img, (3, 3))#第一引数=画像ファイル,第二引数=フィルタの横幅,縦幅
imgs = cv2.hconcat([img, img_blur])#高さが等しい画像を横に連結

cv2.imwrite("nana1.jpg",imgs)#openCVで画像ファイルを保存する
```

<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/4efc69b0-58c6-c983-dded-b5a743b0fa1f.jpeg" class="img" alt="データ">

☚左図はオリジナル画像　　　　　　　　　　☛右図は**平均化フィルタ**を施した画像


右図の方がノイズがぼけていますね。
完全に消すことは難しそうです。。


##平均化フィルタ(フィルタのサイズを1×1から6×6)
```py
img1 = cv2.blur(img, (1, 1))
img2 = cv2.blur(img, (2, 2))
img3 = cv2.blur(img, (3, 3))
img4 = cv2.blur(img, (4, 4))
img5 = cv2.blur(img, (5, 5))
img6 = cv2.blur(img, (6, 6))

imgs_1 = cv2.hconcat([img1, img2, img3])
imgs_2 = cv2.hconcat([img4, img5, img6])
imgs = cv2.vconcat([imgs_1, imgs_2])#幅が等しい画像を縦に連結
cv2.imwrite("nana2.jpg", imgs)
```

![nana6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/44f807c6-d219-0043-4c09-784fc4a17803.jpeg)

左上から順に、フィルタサイズを大きくしていった画像になります。
画像のぼけ具合が**どんどん強く**なっているのがわかりますね。
**右下の写真は白ごまを気にせず、みあちゃんに集中できるようになってきた！！**



#2:ガウシアンフィルタ
**ガウス分布**に従ってフィルタ内の重みを計算したもの。

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/ea0e08dc-a35e-d640-111f-ebed78d93bb7.png" class="img" alt="データ"><img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/33a59100-bf94-54eb-d8b0-b01d2e604f44.png" class="img" alt="データ">



**【平均化フィルタとの違い】**
**置換値**は処理対象となる**真ん中の注目画素が最も重みが大きく**なり、**外側の画素ほど重みが小さく**なるように置換されること。
この特性により、**画素付近の情報をより残したまま**画像をぼかすことが可能となっている。

```py
img_gauss = cv2.GaussianBlur(img, (3, 3), 3)#第3引数は、ガウス関数のσ
imgs = cv2.hconcat([img, img_gauss])
cv2.imwrite("nana3.jpg", imgs)
```


<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/2d793cb3-afa3-6026-1812-b98d2a0edf2e.jpeg" class="img" alt="データ">

☚左図はオリジナル画像　　　　　　　☛右図は**ガウシアンフィルタ(σ=3)**を施した画像

**1の平均化フィルタとあまり変わらないなぁ**

#3:中央値フィルタ
指定したフィルタ内に含まれる画素から**中央値**を取り出し、置き換えたもの。

**【平均化フィルタとの違い】**
**置換値**は平均化された画素値ではなく、**必ず存在する**画素値を使用するという点になります。

```py
img_med = cv2.medianBlur(img, 3)
imgs = cv2.hconcat([img, img_med])
cv2.imwrite("nana4.jpg", imgs)
```
<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/6bb41485-6a26-0992-2dfb-21a2191b72fd.jpeg" class="img" alt="データ">

☚左図はオリジナル画像　　　　　　　☛右図は**中央値フィルタ**を施した画像

**うぉぉぉぉぉぉぉぉぉぉぉぉぉぉぉぉぉぉぉぉぉぉぉ**
**ゴマ塩消えてるぅぅぅぅ**
**過去最高に可愛いみあちゃんになってます！！**

#4:バイラテラルフィルタ
**エッジ以外**はガウシアンフィルタを施すもの。
輝度差が大きい部分は重みが「０」にしてガウシアンフィルタを行う。


<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/d1bfc4cb-17dc-b43b-daad-53977572e24b.png" class="img" alt="データ"> →　　<img width="180" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/d67cd852-2da6-c16f-fb1a-dad5aaefbb52.png" class="img" alt="データ">



**【今までの平滑化フィルタとの違い】**
**エッジ(輪郭)を残しながら**、画像をぼかすことが可能であること

```py
img_bi = cv2.bilateralFilter(img, 9, 75, 75)
imgs = cv2.hconcat([img, img_bi])
cv2.imwrite("nana5.jpg", imgs)
```
<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/683e6368-be50-7b40-1ac6-7f3affd4c862.jpeg" class="img" alt="データ">

☚左図はオリジナル画像　　　　　　　☛右図は**バイラテラルフィルタ**を施した画像


#結果
今回のごま塩ははっきりとしたノイズであったため、**メディアンフィルタ**を施すのが一番であることが分かりましたね。

また、**ノイズの彩度**が**オリジナルデータに近い**ノイズの場合は**バイラテラルフィルタ**が適してるようにも感じました。

みなさんもお気に入りの画像にノイズが紛れ込んでいたら、フィルタリングしましょ！