つれづれなる備忘録

日々の発見をあるがままに綴る

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)

"文字j"
文字j

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が細くなっていく

"iterationsによる収縮処理比較"
iterationsによる収縮処理比較

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が太くなっていく。

"iterationsによる膨張処理"
iterationsによる膨張処理

4. まとめ

 今回はモルフォロジー変換として収縮・膨張処理について取り上げた。次回もモルフォロジー変換のOpening/Closingなどについて取り上げたい。