#開発環境
- OS : macOS Sierra 10.12.6
- Python 3.6.7
- OpenCV 3.4.2
#和了画像に前処理を施す
画像認識の前に,より良い結果が得られるように,この和了画像に仕込みを行います.
- グレースケール化
- 平滑化
- 閾値処理
###1.グレースケール化
一般に画像認識ではRGB値が使われることはほとんどありませんので,グレースケール化を行います.余談ですが,具体的な理由が気になったので調べて見たところ,
・多くの画像処理アルゴリズムは単一チャネル(グレースケール)画像のみを対象とする
・人間の視覚特性として色差成分よりも、輝度成分に対して強い感度を持っている
・計算量削減・作業メモリ削減のために、扱うデータが3チャネルよりも1チャネルの方が好ましい
のような理由でした.なるほど,信憑性は別にして腑に落ちました.
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)
出力画像
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
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)
###3.閾値処理
閾値処理は,その点が閾値(threshold)より大きいか,そうでないかを判定し,2値に振り分けます.
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)
閾値処理にはいくつかモードがありますが,今回使うのはTHRESH_BINARY
.under_thresh
未満の画素値を0(黒),under_thresh
以上の画素値を255(白)とします.パラメータの値は使用する画像依存なので出力から吟味する必要があります.
以上の処理により,輪郭が明確になりました.