画像からのノイズ除去、テクスチャ解析等に使用される演算手法。背景の画素と隣接する物体の画素の関係を膨張(dilate)、収縮(erosion)させることで画像の2値化、グレースケール化を行うことができる。
openCVではmorphologyExのメソッドによりさらに以下の処理が可能。
オープニング処理 収縮した結果に対して同じ回数だけ膨張する
クロージング処理 膨張した結果に対して同じ回数だけ収縮する
グラジエント処理 膨張した結果から収縮した結果を差し引く
トップハット処理 元画像からオープニングした画像を差し引く
ブラックハット処理 クロージングした画像から元画像を差し引く
■入力画像

■処理コード
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('maru.png',0)
kernel = np.ones((5,5),np.uint8)
erode = cv2.erode(img,kernel,iterations = 1)
dilate = cv2.dilate(img,kernel,iterations = 1)
morph_open = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
morph_close = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
morph_gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
morph_tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
morph_blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
plt.subplots_adjust(wspace=1.0, hspace=1.0)
plt.subplot(331)
plt.title("erode")
plt.imshow(erode)
plt.subplot(332)
plt.title("dilate")
plt.imshow(dilate)
plt.subplot(333)
plt.title("morph open")
plt.imshow(morph_open)
plt.subplot(334)
plt.title("morph close")
plt.imshow(morph_close)
plt.subplot(335)
plt.title("morph morph_gradient")
plt.imshow(morph_gradient)
plt.subplot(336)
plt.title("morph morph_tophat")
plt.imshow(morph_tophat)
plt.subplot(337)
plt.title("morph morph_blackhat")
plt.imshow(morph_blackhat)
plt.show()
■処理結果

