Pythonでいろいろやってみる

Pythonを使った画像処理や機械学習などの簡単なプログラムを載せています。

画像を平均化(ぼかし)処理してから二値化してノイズを減らす

やること
  • ファイル名を指定して画像ファイルをグレースケールで読み出す
  • グレースケール画像を平均化(ぼかし)処理する
  • ぼかした画像を二値化し別ウィンドウに表示する
  • キー入力で表示用ウィンドウを破棄し終了
使った関数
  • cv2.imread : 画像ファイルの読み出し
    第2引数にcv2.IMREAD_GRAYSCALE(または0)を指定することでグレースケール変換し読み出す
  • cv2.blur : 画像の平均化(ぼかし)処理。周囲の画素との輝度平均化処理がされる。
  • cv2.threshold : 画像の閾値処理
  • cv2.imshow : 画像を別ウィンドウに表示する
環境
  • windows10 home
  • Anaconda 3/ jupyter notebook 5.6.0
  • Python 3.7.0
  • OpenCV 4.0.0
準備

画像ファイルはフリー写真素材ぱくたそからダウンロードさせていただき、"bricks.jpg"というファイル名で、jupyter notebookファイル(***.ipynb)と同じディレクトリに保存しました。

f:id:T_A_T:20190224133248j:plain
元画像

コード
import cv2  #OpenCVのインポート

fname="bricks.jpg" #開く画像ファイル名
threshold=127 #二値化閾値

img = cv2.imread(fname,cv2.IMREAD_GRAYSCALE) #画像をグレースケールで読み出しオブジェクトimgに代入
blur = cv2.blur(img,(9,9)) #オブジェクトimgを輝度平均化処理する。第二引数は平均化するピクセル数で、9,9は9x9ピクセル(81ピクセル)

ret, img_binary= cv2.threshold(blur, threshold, 255, cv2.THRESH_BINARY) #オブジェクトimgを閾値threshold(127)で二値化しimg_binaryに代入
cv2.imshow("binary",img_binary) #別ウィンドウを開き(ウィンドウ名 "binary")オブジェクトimg_binaryを表示

cv2.waitKey(0) #キー入力待ち
cv2.destroyAllWindows() #ウインドウを閉じる

実行結果

別ウィンドウが開き二値化された白黒画像が表示されます。何かキー入力するとウィンドウが閉じ、終了します。 平均化(ぼかし)処理をしてから二値化することで細かなノイズを消すことができます。

f:id:T_A_T:20190224152851p:plain
二値化画像(平均化処理あり)
平均化処理をしないで二値化した場合はこのように細かなノイズが残ります。
f:id:T_A_T:20190224142655p:plain
二値化画像(平均化処理無し)

以下のサイトを参考にさせていただきました

Pythonの文法メモ > 【OpenCV】フィルタリングによる画像のスムージング

ブログランキングに参加しています

にほんブログ村 IT技術ブログへ
にほんブログ村