基本となる画像処理を一から勉強していくシリーズ (2)。
OpenCV-Pythonチュートリアルを参考に、
画像認識本 https://www.amazon.co.jp/dp/4061529129/
でやっている処理の理解を進める方針です。
目次
- 環境
- 箱型フィルタ
- ガウシアンフィルタ
- 中央値フィルタ
- バイラテラルフィルタ
1. 環境
Python 3.7.0
OpenCV 4.1.0
Jupyter Notebook
2. 箱型フィルタ
画素周辺の n x m ウィンドウの平均値を取る。
img = cv2.imread('brabra/1.jpg',0)
# n x m = 150 x 150
blur = cv2.blur(img,(150,150))
plt.subplot(121),plt.imshow(img,'gray'),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blur,'gray'),plt.title('Blurred')
plt.xticks([]), plt.yticks([])
plt.show()
角(高周波成分)が取れてぼやけた画像になった。
3. ガウシアンフィルタ
画素周辺の画素をガウシアン分布で重み付けする。
img = cv2.imread('brabra/1.jpg',0)
# sigmax = sigmay = 71
blur = cv2.GaussianBlur(img,(71,71),0)
plt.subplot(121),plt.imshow(img,'gray'),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blur,'gray'),plt.title('Blurred')
plt.xticks([]), plt.yticks([])
plt.show()
箱型フィルタよりもくっきりかつまろやか?
3. 中央値フィルタ
ウィンドウの中の画素の中央値を使う。粒粒ノイズのような飛び値に強い。
img = cv2.imread('brabra/1.jpg',0)
# window = 151
blur = cv2.medianBlur(img,151)
plt.subplot(121),plt.imshow(img,'gray'),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blur,'gray'),plt.title('Blurred')
plt.xticks([]), plt.yticks([])
plt.show()
確かに飛び値が取れてマイルド。
4. バイラテラルフィルタ
エッジを残したまま平均化する処理とのこと。これはガウシアンフィルタの近傍の画素で重み付けするのに加えて、注目画素と大きく異なる画素の重みを弱くすることで平滑化&エッジ残しを実現するそう。
img = cv2.imread('brabra/1.jpg',0)
blur = cv2.bilateralFilter(img,51,11,11)
plt.subplot(121),plt.imshow(img,'gray'),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blur,'gray'),plt.title('Blurred')
plt.xticks([]), plt.yticks([])
plt.show()
輪郭残る感じ。
5回処理を繰り返すと絵画っぽくなった。
まとめ
今回は平滑化について理解を深めた。
次はエッジ検出をやる。
参考文献
-
OpenCVを使った画像処理(OpenCV-Pythonチュートリアル)
http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_imgproc/py_table_of_contents_imgproc/py_table_of_contents_imgproc.html#py-table-of-content-imgproc -
画像認識(機械学習プロフェッショナルシリーズ)
https://www.amazon.co.jp/dp/4061529129/