图像形态学


理论

数学形态学(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)
posted @ 2021-02-04 10:41  月思  阅读(214)  评论(0编辑  收藏  举报