图像形态学
理论
数学形态学(Mathematical morphology) 是一门建立在 格论
和 拓扑学
基础之上的图像分析学科,是 数学形态学图像处理
的基本理论。
其基本的运算包括:腐蚀和膨胀、开运算和闭运算、骨架抽取、极限腐蚀、击中击不中变换、形态学梯度、Top-hat变换、颗粒分析、流域变换等。
一、腐蚀操作
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('dige.png')
kernel = np.ones((5, 5), np.uint8)
erosion = cv2.erode(img, kernel, iterations = 1)
# iterations 迭代次数;如果多迭代几次,可能腐蚀的更强烈
# cv_show(erosion)
plt.imshow(erosion)
迭代次数的作用
kernel = np.ones((5, 5), np.uint8)
erosion = cv2.erode(img, kernel, iterations = 2)
plt.imshow(erosion)
核的作用
kernel = np.ones((3, 3), np.uint8)
erosion = cv2.erode(img, kernel, iterations = 1)
plt.imshow(erosion)
pie = cv2.imread('pie.png')
kernel = np.ones((5, 5), np.uint8)
e1 = cv2.erode(pie, kernel, iterations = 1)
plt.imshow(e1)
kernel = np.ones((15, 15), np.uint8)
e1 = cv2.erode(pie, kernel, iterations = 5)
plt.imshow(e1)
二、膨胀操作
和腐蚀操作 互为逆运算;
dilate 方法
kernel = np.ones((5, 5), np.uint8)
erosion = cv2.erode(img, kernel, iterations = 1) # 腐蚀
dilate = cv2.dilate(erosion, kernel, iterations=2) # 膨胀
plt.imshow(dilate)
kernel = np.ones((5, 5), np.uint8)
d1 = cv2.dilate(pie, kernel, iterations=15) # 膨胀
plt.imshow(d1)
三、开运算与闭运算
腐蚀和膨胀的组合
开运算
先腐蚀,再膨胀
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
plt.imshow(opening)
闭运算
先膨胀,再腐蚀
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
plt.imshow(closing)
# 毛刺不仅没消失,还明显了
四、梯度运算
膨胀 --> 胖
腐蚀 --> 瘦
梯度 = 胖 - 瘦 (的轮廓)
kernel = np.ones((5, 5), np.uint8)
gradient = cv2.morphologyEx(pie, cv2.MORPH_GRADIENT, kernel)
plt.imshow(gradient)
# 修改核大小;宽度约等于 15
kernel = np.ones((15, 15), np.uint8)
gradient = cv2.morphologyEx(pie, cv2.MORPH_GRADIENT, kernel)
plt.imshow(gradient)
# 修改核大小
kernel = np.ones((25, 10), np.uint8)
gradient = cv2.morphologyEx(pie, cv2.MORPH_GRADIENT, kernel)
plt.imshow(gradient)
五、礼帽和黑帽
礼帽 = 原始输入 - 开运算结果
开:先腐蚀后膨胀(不带刺)
礼帽:刺
黑帽 = 闭运算 - 原始输入
黑帽:原始的小轮廓
kernel = np.ones((5, 5), np.uint8)
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
plt.imshow(tophat)
kernel = np.ones((5, 5), np.uint8)
tophat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
plt.imshow(tophat)