LoginSignup
38
39

More than 3 years have passed since last update.

はじめに

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

今回使用する画像

test.png
今回使用するのはこの画像です。
ノイズだらけの2値画像を作ってみたので、今からこれらのノイズをちょっとずつ消していこうと思います。
OpenCVを使うので、まだインストールしていない方はインストールの方宜しくお願いします。

中央値フィルタ

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


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

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

スクリーンショット 2019-06-07 14.45.47.png
これで完全にごま塩ノイズが消えました。
みなさんが自前の画像を使うときもちょっとずつksizeを変えて、その都度確認するようにしてみてください。

膨張・収縮

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

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

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

オープニング処理

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

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
確かに白いごま塩は消えていますが、白い部分が収縮したため、黒い部分が相対的に大きくなっています。
なので、次は膨張処理を加えます。
その後の画像がこちら
スクリーンショット 2019-06-07 15.07.58.png
さっきよりは黒い部分が小さくなりましたね!
でもまだ足りないので、iterationsの箇所を10より大きくすると、もっと綺麗に黒いノイズが消えるのでやってみてください。

クロージング処理

さっきの逆ですね。

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
白い部分が膨張して、黒い部分がかき消されていますが、白いノイズが大きくなってしまっています。
なので収縮処理を加えるとこのようになります。
スクリーンショット 2019-06-07 15.13.35.png
このように白いノイズが小さくなりました!
先ほどと同様にiterationを大きくするともっと綺麗に消えますが、この方が効果がわかりやすいので今はご了承ください。

終わりに

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

最後に、医学生である僕が所属しているツカザキ病院眼科AIチームのページも見ていただけたら幸いです!ぜひご覧ください!
ツカザキ病院眼科AIチーム DeepOculus
では、また次の記事で!

38
39
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
38
39