1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

麻雀の点数判定アプリを作る#2

Last updated at Posted at 2019-01-03

#開発環境

  • OS : macOS Sierra 10.12.6
  • Python 3.6.7
  • OpenCV 3.4.2

#和了画像に前処理を施す
agari2.png
画像認識の前に,より良い結果が得られるように,この和了画像に仕込みを行います.

  1. グレースケール化
  2. 平滑化
  3. 閾値処理

###1.グレースケール化
一般に画像認識ではRGB値が使われることはほとんどありませんので,グレースケール化を行います.余談ですが,具体的な理由が気になったので調べて見たところ,

・多くの画像処理アルゴリズムは単一チャネル(グレースケール)画像のみを対象とする
・人間の視覚特性として色差成分よりも、輝度成分に対して強い感度を持っている
・計算量削減・作業メモリ削減のために、扱うデータが3チャネルよりも1チャネルの方が好ましい

のような理由でした.なるほど,信憑性は別にして腑に落ちました.

to_grayscale.py
import cv2
import matplotlib.pyplot as plt

path = '/Users/mac/sample.png'
img = cv2.imread(path)

gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
plt.imshow(gray_img)

出力画像
gray_img.jpg
cv2.imreadでは画像をBGRで読み込んでいることに注意します.
そのため,RGB画像をグレースケール画像に変換する際,BGR2GRAYと指定しなければなりません.RGB2GRAYとしても同様の出力はされますが,グレースケール化のアルゴリズムとしてRGBそれぞれに重みを付けるものも存在するため,モードの指定には厳密であるべきでしょう.

参考 : https://qiita.com/yoya/items/96c36b069e74398796f3

###2.平滑化
平滑化を行うことで,画像に「ぼかし」を与えることができます.画像加工アプリでも馴染みのある,にきびなどの小さくて不要なものを消すブラー効果と同じ目的で使用します.次の閾値処理において,余分な細かい部分を無視することができます.今回は一般的な5×5ガウシアンフィルタを使います.第2引数で使用する行列の大きさを指定.
他にもOpenCVでは様々なフィルタが用意されています.

参考 : https://docs.opencv.org/3.1.0/d4/d13/tutorial_py_filtering.html#gsc.tab=0

to_blur.py
import cv2
import matplotlib.pyplot as plt

path = '/Users/mac/sample.png'

img = cv2.imread(path)
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

filtered_img = cv2.GaussianBlur(gray_img, (5, 5), 0)
plt.imshow(filtered_img)

出力画像
gray_img.jpg

###3.閾値処理
閾値処理は,その点が閾値(threshold)より大きいか,そうでないかを判定し,2値に振り分けます.

to_threshold.py
import cv2
import matplotlib.pyplot as plt

path = '/Users/mac/sample.png'

under_thresh = 150
maxValue = 255

img = cv2.imread(path)
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
filtered_img = cv2.GaussianBlur(gray_img, (5, 5), 0)

th, th_img = cv2.threshold(filtered_img, under_thresh, maxValue, cv2.THRESH_BINARY)
plt.imshow(th_img)

出力画像
gray_img.jpg

閾値処理にはいくつかモードがありますが,今回使うのはTHRESH_BINARYunder_thresh未満の画素値を0(黒),under_thresh以上の画素値を255(白)とします.パラメータの値は使用する画像依存なので出力から吟味する必要があります.

以上の処理により,輪郭が明確になりました.

1
3
2

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
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?