画像からのノイズ除去、テクスチャ解析等に使用される演算手法。背景の画素と隣接する物体の画素の関係を膨張(dilate)、収縮(erosion)させることで画像の2値化、グレースケール化を行うことができる。
openCVではmorphologyExのメソッドによりさらに以下の処理が可能。
オープニング処理 収縮した結果に対して同じ回数だけ膨張する
クロージング処理 膨張した結果に対して同じ回数だけ収縮する
グラジエント処理 膨張した結果から収縮した結果を差し引く
トップハット処理 元画像からオープニングした画像を差し引く
ブラックハット処理 クロージングした画像から元画像を差し引く
■入力画像
■処理コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
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() |
■処理結果