形态学操作(morphology operators)
图像形态学操作 – 基于形状的一系列图像处理操作的合集,
主要是基于集合论基础上的形态学数学。
形态学主要针对二值图像进行处理,特别是OCR等这些处理,
还有特征提取、区域分割等也可以通过形态学的方法进行。
形态学有四个基本操作:腐蚀、膨胀、开、闭。
膨胀与腐蚀是图像处理中最常用的形态学操作手段。
1)膨胀(dilate)
跟卷积操作类似,假设有图像A和结构元素B,
结构元素B在A上面移动,其中B定义其中心为锚点,
以B覆盖下A的最大像素值(偏白)替换锚点的像素,
其中B作为结构体可以是任意形状。
(与卷积不同之处,可以是线、矩阵、圆、十字等形状)
最大值(偏白)替换就是向原图边缘膨胀,白色变多,黑色变小
(2)腐蚀(erode)
腐蚀跟膨胀操作的过程类似,唯一不同的是以最小值(偏黑)
替换锚点重叠下图像的像素值。
二值图像与灰度图像上的腐蚀操作:
最小值(偏黑)替换就是向背景做了腐蚀,黑色变大,白色变小。
import cv2
import numpy as np
# 腐蚀 取最小值
def erossionDef(img):
kernel = np.ones((5,5),np.uint8)
erossion = cv2.erode(img,kernel,iterations=1)
return erossion
# 膨胀 取最大值
def dilate(img):
kernel = np.ones((5, 5), np.uint8)
img = cv2.dilate(img,kernel,iterations=1)
return img
# 开运算:先腐蚀 再膨胀
def morphOpen(img):
kernel = np.ones((5, 5), np.uint8)
img = cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)
return img
# 闭运算:先膨胀 再腐蚀
def morphClose(img):
kernel = np.ones((5, 5), np.uint8)
img = cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)
return img
# 梯度 = 膨胀 - 腐蚀
def gradientImg(img):
kernel = np.ones((3,3), np.uint8)
img = cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel)
return img
# 礼帽 = 原始输入 - 开运算结果
def topHat(img):
kernel = np.ones((5, 5), np.uint8)
img = cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)
return img
def blackHat(img):
kernel = np.ones((5, 5), np.uint8)
img = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
return img
img = cv2.imread("img1.png")
# img = erossionDef(img)
# img1 = dilate(img)
# img2 = erossionDef(img)
# img3 = gradientImg(img)
#
# img = np.hstack((img,img1,img2,img3))
img = blackHat(img)
cv2.imshow("img",img)
cv2.waitKey(0)
cv2.destroyAllWindows()