機械系エンジニアの備忘録

20代独身社会人。仕事では機械・機構の研究開発を行っているエンジニアが、自分の専門分野ではないpythonを扱って楽しむブログです。

MENU

【python】【OpenCV】画像の平滑化処理(ノイズ除去を行う)

OpenCVに標準で搭載されている関数を使ってノイズ除去を行う

f:id:stjun:20200310235904p:plain

左が元画像、右がノイズ除去後

※初心者向けにpythonの勉強法とその手順を記事にしました。

www.stjun.com

 

 

1. はじめに

これまでOpenCVを用いて、画像の2値化・3値化、輪郭抽出などを行いました。

www.stjun.com

www.stjun.com

www.stjun.com

今回はOpenCVに標準で搭載されている関数を用いて、簡単にノイズ除去を行ってみます。

 

2. コードと実行結果と説明

2.1 コード:
#平滑化(ノイズ除去)
import cv2
#画像の読み込み
img=cv2.imread('./test.jpg',0)

#ノイズをランダムで入れる
x=np.random.randint(400,size=500)
y=np.random.randint(600,size=500)
for i,j in zip(x,y):
    img[i,j]=200

#平滑化処理
#単純なマスク
img_blur=cv2.blur(img,(3,3))
#ガウシアン
img_gaus=cv2.GaussianBlur(img,(9,9),2)
#中央値
img_median=cv2.medianBlur(img,5)
#バイラテラル
img_bil=cv2.bilateralFilter(img,50,30,20)

#画像の表示
cv2.imshow("original",img)
cv2.imshow("blur",img_blur)
cv2.imshow("Gaussian",img_gaus)
cv2.imshow("median",img_median)
cv2.imshow("bilateral",img_bil)
cv2.waitKey(0)
cv2.destroyAllWindows()

上記を実行すると、元画像と4つのノイズ除去画像がでてきます。

ちなみに元画像のノイズは「ごま塩ノイズ」と呼ばれており、画像にちっちゃい点がたくさんあるノイズです。

それではフィルタについて簡単に説明していきます。

 

2.2 blurを用いたノイズ除去
img_blur=cv2.blur(img,(3,3))

cv2.blur()で実行できます。

引数は左から順に、ノイズを除去したい画像、カーネルの大きさです。

今回は(3,3)にしていますので横3マス、縦3マス(合計で9マス)のカーネルになります。

つまりある画素に注目すると、その画素の上下左右斜めの画素地の平均を計算してることになります。

画像としては少しノイズが目立たなくなりましたが、輪郭がぼやけてしまっています。

f:id:stjun:20200311001350p:plain

元画像

f:id:stjun:20200311001410p:plain

blurによるノイズ除去

 

2.3 GaussianBlurを用いたノイズ除去
#ガウシアン
img_gaus=cv2.GaussianBlur(img,(9,9),2)

引数は左から、ノイズ除去したい画像、カーネルのサイズ(横,縦),標準偏差です。

先ほどのblurとは違い、単に平均を取るのではなく、Gaussian分布によって重みづけをしているみたいです。

画像を見ると確かにノイズは消えていますが、ものすごくぼやけてます。

ノイズ除去より、モザイク処理に使った方が良いかもしれません。

f:id:stjun:20200311001350p:plain

元画像

f:id:stjun:20200311002052p:plain

Gaussian

 

2.4 medianBlurを用いたノイズ除去
#中央値
img_median=cv2.medianBlur(img,5)

引数は左から、ノイズ除去したい画像、カーネルのサイズです。

2.2のblurとの違いは、blurカーネル内の平均を計算していたのに対し、medianblurはカーネル内の中央値を計算しています。

画像を見るとノイズが消えつつ輪郭もしっかりと残っています。

今回の様なごま塩ノイズにはmedianBlurは良いかもしれません。

f:id:stjun:20200311001350p:plain

元画像

f:id:stjun:20200311002442p:plain

medianBlur

 

2.5 bilateralFileterを用いたノイズ除去
#バイラテラル
img_bil=cv2.bilateralFilter(img,50,30,20)

引数は左から、ノイズ除去したい画像、ぼかす領域の大きさ、色空間に関する標準偏差距離空間に関する標準偏差のようです。

平たくいれば、エッジを残したままノイズを除去する(ぼかす)処理です。

画像を見るとノイズが低減しつつ、輪郭もしっかりと残っています。

標準偏差などの値を最適にすれば有効なノイズ除去手段かもしれません。

f:id:stjun:20200311001350p:plain

元画像

f:id:stjun:20200311003733p:plain

bilateral

 

 

自分が使ってるお得情報の紹介

私はAmazon kindle unlimitedというサービスを1年以上利用しています。

これは月額980円で 和書12万冊以上の電子書籍を読めるサービスです。

ビジネス本、雑誌、漫画、技術本など様々な本を読むことができます。10冊まで端末にダウンロードできるのでネット環境がなくても(オフラインでも)見れます。

なおkindle unlimitedは最初の30日間無料のため、気軽に登録してみて、あまり読みたい本が無ければすぐに解約しても問題ありません。

それか30日内に気になる本を全て読破すれば実質タダです。

ぜひ気になった方はチェックしてみて下さい。

なおkindleにない本等を買う時はamazonギフト券(amazonで使えるポイント)を買い、ポイントで数冊まとめて買った方がお得です。

ギフト券(ポイント)は買ったら10年も有効で、ポイントが付きます。さらに本をまとめ買い(2冊以上同時に)買うと、ポイントがもらえます。

https://www.amazon.co.jp/b?ie=UTF8&node=5431437051

学生さんであればkindle unlimitedよりも年2450円(月210円程度)で映画見放題、音楽聞き放題、本読み放題の「prime student」がおすすめです。

 

3. 最後に

いかがだったでしょうか。これでOpenCVの基本的な内容は書けたので、Tkinterとの組み合わせを検討してみたいです。