画像のノイズ除去

#はじめに
こんにちは！
今回は画像に入ったノイズの除去など画像処理について書いてみようと思います。
**セグメンテーションのために前処理をしたら無駄なノイズが入って困った！**なんて時に使えるので参考にしてみてください。

##今回使用する画像
![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405324/12824219-95ab-b0a4-1d3e-bc2de5bf95d9.png)
今回使用するのはこの画像です。
ノイズだらけの2値画像を作ってみたので、今からこれらのノイズをちょっとずつ消していこうと思います。
OpenCVを使うので、まだインストールしていない方はインストールの方宜しくお願いします。
##中央値フィルタ

一つ目は「中央値フィルタ」です。
これは今回のような細かいノイズ（通称　ごま塩ノイズ）と呼ばれるノイズを消したい時に最適です。

```python

import cv2
import matplotlib.pyplot as plt

img = cv2.imread("./test.png")
 # アパーチャーサイズ 3, 5, or 7 など 1 より大きい奇数。数値が大きいほどぼかしが出る。
ksize=3
#中央値フィルタ
img_mask = cv2.medianBlur(img,ksize)
plt.imshow(img_mask)
```
するとこのような画像になります。
![スクリーンショット 2019-06-07 14.44.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405324/672dabc8-37e4-3aca-c33c-a3820e29d66b.png)

まだノイズが残っていますね。
なので、カーネルサイズをどんどん大きくしてみましょう。ここで注意なのですが、カーネルサイズは1より大きい奇数でないといけません。
ksize = 15にしてみます。

![スクリーンショット 2019-06-07 14.45.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405324/35e8db9d-c011-188e-086b-de3e4ae54df7.png)
これで完全にごま塩ノイズが消えました。
みなさんが自前の画像を使うときもちょっとずつksizeを変えて、その都度確認するようにしてみてください。

#膨張・収縮
2つ目は「膨張・収縮」です。
これらもOpenCVの機能であり、膨張処理は白色(255)の領域を膨張させ、収縮処理は白色(255)の部分を収縮させる処理です。
わかりにくいと思いうので実際にやってみましょう。

ここで、収縮処理をした後に同じ回数だけ膨張処理をすることを**「オープニング処理」**、膨張処理をした後に同じ回数だけ収縮処理をする頃を**「クロージング処理」**と言います。

前者は白色のノイズ除去、後者は黒色のノイズ除去に役立ちます。

###オープニング処理

まずはオープニング処理をしていきます。

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

# 膨張・収縮処理
img = cv2.imread("./test.png")
# 近傍の定義
neiborhood = np.array([[0, 1, 0],[1, 1, 1],[0, 1, 0]],
             np.uint8)
# 収縮
img_erode = cv2.erode(img,neiborhood,iterations=10)
# 膨張
img_dilate = cv2.dilate(img_erode,neiborhood,iterations=10)

plt.imshow(img_erode)
```
収縮処理をした後の画像がこれです。
![スクリーンショット 2019-06-07 15.06.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405324/d63fb5a9-29d7-287c-f9a1-89563da50da4.png)
確かに白いごま塩は消えていますが、白い部分が収縮したため、黒い部分が相対的に大きくなっています。
なので、次は膨張処理を加えます。
その後の画像がこちら
![スクリーンショット 2019-06-07 15.07.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405324/597e996f-c143-c68f-8cee-b62481c4bb29.png)
さっきよりは黒い部分が小さくなりましたね！
でもまだ足りないので、iterationsの箇所を10より大きくすると、もっと綺麗に黒いノイズが消えるのでやってみてください。

###クロージング処理
さっきの逆ですね。

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

# 膨張・収縮処理
img = cv2.imread("./test.png")
# 近傍の定義
neiborhood = np.array([[0, 1, 0],[1, 1, 1],[0, 1, 0]],
             np.uint8)
#膨張
img_dilate = cv2.dilate(img,neiborhood,iterations=10)
#収縮
img_erode = cv2.erode(img_dilate,neiborhood,iterations=10)

plt.imshow(img_dilate)
```
するとこのような画像が表示されます。
![スクリーンショット 2019-06-07 15.12.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405324/e97af032-a51c-7154-ce9d-3b1f28ebecd3.png)
白い部分が膨張して、黒い部分がかき消されていますが、白いノイズが大きくなってしまっています。
なので収縮処理を加えるとこのようになります。
![スクリーンショット 2019-06-07 15.13.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405324/b4fba079-0805-bd7f-d39d-a41620a1d85b.png)
このように白いノイズが小さくなりました！
先ほどと同様にiterationを大きくするともっと綺麗に消えますが、この方が効果がわかりやすいので今はご了承ください。

#終わりに
いかがでしたか？
今回のノイズ処理はセグメンテーションのために頑張って色ぬりをした人のためにあるようなものです。
色塗りしたのに、なんか変なノイズが入った。。。なんて時にご活用ください。

最後に、医学生である僕が所属しているツカザキ病院眼科AIチームのページも見ていただけたら幸いです！ぜひご覧ください！
[ツカザキ病院眼科AIチーム DeepOculus](https://qiita.com/organizations/deepoculus)
では、また次の記事で！