当前位置: 首页 > 工具软件 > 水滴网 > 使用案例 >

opencv 水滴检测 形态学处理

微生鸿轩
2023-12-01

背景

我在水滴检测时参考了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学习—形态学处理

 类似资料: