OpenCVでのモルフォロジー変換(Morphological Transformations)の解説

目次

モルフォロジー変換の概要
1. 収縮(Erosion)
2. 膨張(Dilation)
3. オープニング(Opening)
4. クロージング(Closing)
5. モルフォロジー勾配
6. トップハット変換
7. ブラックハット変換

モルフォロジー変換とは(Morphological Transformations)

モルフォロジー変換は、2値画像に関して,「膨張」や「収縮」などのシンプルな画像処理のことです。モルフォロジー変換には入力画像と と構造的要素(Kernel)の二つを入力として与えます。基本的なモルフォロジー処理として,収縮(Erosion)と膨張(Dilation)が挙げられます.他には,この二つの処理を組み合わせたオープニングとクロージングといった処理も挙げられます。

ライブラリのインポート

import cv2
from google.colab.patches import cv2_imshow

1. 収縮(Erosion)

収縮処理は、収縮処理が施された画像中のオブジェクトは細くなる処理です。オブジェクトの境界付近の情報が消えやすくなることです。下記の図は収縮処理です。

# 画像を読み込む
img = cv2.imread('input_image01.jpg', 0)
kernel = np.ones((5,5), np.uint8)

# 処理
img_erosion1 = cv2.erode(img,kernel,iterations = 1)
img_erosion2 = cv2.erode(img,kernel,iterations = 2)

# 結果表示
cv2_imshow(img)
cv2_imshow(img_erosion1)
cv2_imshow(img_erosion2)

2. 膨張(Dilation)

膨張処理はその名前の通り,画素を膨張 させる処理のことです。オブジェクトの境界付近の情報が増強しやすくなる。そのため、収縮処理が施された画像中のオブジェクトは太くなります。下記の図は収縮処理です。

# 画像を読み込む
img = cv2.imread('input_image01.jpg', 0)
kernel = np.ones((5,5), np.uint8)

# 処理
img_dilation1 = cv2.dilate(img, kernel, iterations=1)
img_dilation2 = cv2.dilate(img, kernel, iterations=2)

# 結果表示
cv2_imshow(img)
cv2_imshow(img_dilation1)
cv2_imshow(img_dilation2)

3. オープニング(Opening)

オープニング処理は、画像中のオブジェクトを収束させたあとに膨張させる処理のこと。画像中にノイズ(オブジェクトの背景にある細かいノイズ)を除去するのに適しています。

# 画像を読み込む
img = cv2.imread('input_image02.jpg', 0)
kernel = np.ones((5,5), np.uint8)

# 処理
img_MORPH_OPEN = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

# 結果表示
cv2_imshow(img)
cv2_imshow(img_MORPH_OPEN)

4. クロージング(Closing)

クロージング処理はオープニング処理の逆の処理を指し, 膨張の後に収縮 をする処理です。クロージング処理は、オブジェクトの中に含まれる細かい黒点を埋めるのに適しています。

# 画像を読み込む
img = cv2.imread('input_image03.jpg', 0)
kernel = np.ones((5,5), np.uint8)

# 処理
img_MORPH_CLOSE = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

# 結果表示
cv2_imshow(img)
cv2_imshow(img_MORPH_CLOSE)

5. モルフォロジー勾配

モルフォロジー勾配は、膨張した画像と収縮した画像の差分をとる処理です。
結果として物体の外郭(境界線)が得られます。

# 画像を読み込む
img = cv2.imread('input_image01.jpg', 0)
kernel = np.ones((5,5), np.uint8)

# 処理
img_MORPH_GRADIENT = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)

# 結果表示
cv2_imshow(img)
cv2_imshow(img_MORPH_GRADIENT)

6. トップハット変換

トップハット変換は、入力画像とオープニング処理が施された画像の差分を求める処理です。元画像からオープンした画像を減算します。明るい部分の抽出に有効です。

# 画像を読み込む
img = cv2.imread('input_image01.jpg', 0)
kernel = np.ones((5,5), np.uint8)

# 処理
img_MORPH_TOPHAT = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)

# 結果表示
cv2_imshow(img)
cv2_imshow(img_MORPH_TOPHAT)

7. ブラックハット変換

ブラックハット変換は、入力画像とクロージング処理が施された画像の差分を求める処理です。黒い部分の抽出に有効です。

# 画像を読み込む
img = cv2.imread('input_image05.jpg', 0)
kernel = np.ones((5,5), np.uint8)

# 処理
img_MORPH_BLACKHAT = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)

# 結果表示
cv2_imshow(img)
cv2_imshow(img_MORPH_BLACKHAT)