OpenCVの使い方13 ~ モルフォロジー変換
今回はOpenCVを用いて膨張処理,収縮処理といったモルフォロジー変換を適用する方法について紹介する。
1. サンプル画像の生成
今回はOpenCV チュートリアル labs.eecs.tottori-u.ac.jp
にある以下の文字jをテスト画像src
として用いる。
Google Colabでのサンプル画像読み込み
import cv2 import numpy as np from matplotlib import pyplot as plt from google.colab import files uploaded_file = files.upload() uploaded_file_name = next(iter(uploaded_file)) orig = cv2.imread(uploaded_file_name) src = cv2.cvtColor(orig, cv2.COLOR_BGR2RGB) plt.imshow(src)
2. 収縮処理
モルフォロジー変換は2値画像に対しての処理で収縮と膨張は適当なカーネル、例えば5x5の1行列を用意して収縮の場合はcv2.erode()
、膨張の場合はcv2.dilate()
を元画像に適用する。
まずカーネルに対する収縮処理の違いを見るためにnp.ones()
で3x3,5x5,7x7の1行列を生成する。収縮処理はcv2.erode(img,kernel,iterations)
でimg
が画像データでグレー画像、RGB画像いずれも処理できる。
またiterations
は処理の繰り返し回数でとりあえず1とする。
import cv2 import numpy as np from matplotlib import pyplot as plt kernel = np.ones((3,3),np.uint8) erosion3 = cv2.erode(src,kernel,iterations = 1) kernel = np.ones((5,5),np.uint8) erosion5 = cv2.erode(src,kernel,iterations = 1) kernel = np.ones((7,7),np.uint8) erosion7 = cv2.erode(src,kernel,iterations = 1)
左から元画像、カーネルサイズ3x3, 5x5, 7x7の収縮処理結果を表示する。
plt.figure(figsize=(8,10)) plt.subplot(1,4,1) plt.imshow(src) plt.subplot(1,4,2) plt.imshow(erosion3) plt.subplot(1,4,3) plt.imshow(erosion5) plt.subplot(1,4,4) plt.imshow(erosion7)
カーネルサイズが大きいほど文字jが細くなっていくことが確認できる。次にカーネルを3x3に固定してinterations
を変えた場合を比較する。
kernel = np.ones((3,3),np.uint8) erosion_it2 = cv2.erode(src,kernel,iterations = 2) kernel = np.ones((3,3),np.uint8) erosion_it3 = cv2.erode(src,kernel,iterations = 3) plt.figure(figsize=(8,5)) plt.subplot(1,3,1) plt.imshow(src) plt.subplot(1,3,2) plt.imshow(erosion_it2) plt.subplot(1,3,3) plt.imshow(erosion_it3)
左から元画像,iterations=2,3の結果を表示しており、iterations
の数値を上げることで文字jが細くなっていく
3.膨張
膨張は収縮と逆に文字jを太くする処理でcv2.dilate(img,kernel,iterations)
を用いる。引数は収縮と同様の意味で今回もカーネルに対する収縮処理の違いを見るためにnp.ones()
で3x3,5x5,7x7の1行列を生成する。
kernel = np.ones((3,3),np.uint8) dilation3 = cv2.dilate(src,kernel,iterations = 1) kernel = np.ones((5,5),np.uint8) dilation5 = cv2.dilate(src,kernel,iterations = 1) kernel = np.ones((7,7),np.uint8) dilation7 = cv2.dilate(src,kernel,iterations = 1) plt.figure(figsize=(8,10)) plt.subplot(1,4,1) plt.imshow(src) plt.subplot(1,4,2) plt.imshow(dilation3) plt.subplot(1,4,3) plt.imshow(dilation5) plt.subplot(1,4,4) plt.imshow(dilation7)
左から元画像、カーネルサイズ3x3, 5x5, 7x7の膨張処理結果を表示するがカーネルサイズが大きいほど文字jが太くなっていく。
iterations
に対してもカーネルを3x3に固定して膨張処理の違いを確認する。
kernel = np.ones((3,3),np.uint8) dilation_it2 = cv2.dilate(src,kernel,iterations = 2) kernel = np.ones((3,3),np.uint8) dilation_it3 = cv2.dilate(src,kernel,iterations = 3) plt.figure(figsize=(8,5)) plt.subplot(1,3,1) plt.imshow(src) plt.subplot(1,3,2) plt.imshow(dilation_it2) plt.subplot(1,3,3) plt.imshow(dilation_it3)
左から元画像,iterations=2,3の結果を表示しており、iterations
の数値を上げることで文字jが太くなっていく。
4. まとめ
今回はモルフォロジー変換として収縮・膨張処理について取り上げた。次回もモルフォロジー変換のOpening/Closingなどについて取り上げたい。