我在水滴检测时参考了GMM的代码,里面有这样的操作:
# 定义结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3,3))
# 构造混合高斯模型
model = cv2.createBackgroundSubtractorMOG2(50, 16, detectShadows=False)
# 运用高斯模型进行拟合
fgmk = model.apply(frame)
# 使用前面的卷积,用形态学的开运算进行背景减除
fgmk = cv2.morphologyEx(fgmk, cv2.MORPH_OPEN, kernel)
morphology是形态学、形态论的意思。彼时我还不知道什么是形态学,也不知道什么是结构元素,混合高斯模型(当然现在也不甚懂,只听得大佬跟我说什么用GMM进行拟合、然后进行形态学操作。于是哄堂大笑起来,店内外充满了快活的空气…
anyway,这里所做的开运算就是一个形态学操作
后来为了去除阴影的干扰,调了很多参,也试了各种形态学处理,其实不甚懂的,做了操作如下:
# 运用高斯模型进行拟合
#fgmk = model.apply(frame, learningRate=1)
fgmk = model.apply(crop)
'''
形态学运算
'''
# 形态学的开运算进行背景减除
fgmk = cv2.morphologyEx(fgmk, cv2.MORPH_OPEN, kernel)
# 先开后闭
fgmk = cv2.morphologyEx(fgmk, cv2.MORPH_OPEN, kernel)
fgmk = cv2.morphologyEx(fgmk, cv2.MORPH_CLOSE, kernel)
# 闭开
fgmk = cv2.morphologyEx(fgmk, cv2.MORPH_CLOSE, kernel)
fgmk = cv2.morphologyEx(fgmk, cv2.MORPH_OPEN, kernel)
#闭
fgmk = cv2.morphologyEx(fgmk, cv2.MORPH_CLOSE, kernel)
# 二值化
fgmk[fgmk<230] = 0
#retval, dst = cv2.threshold(fgmk, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
#retval, fgmk = cv2.threshold(fgmk, 230, 255, cv2.THRESH_BINARY)
具体的形态学处理可以参考博客:
OpenCV-Python教程(4、形态学处理)
(四)OpenCV-Python学习—形态学处理