• Opencv中的MeanShift图像分割和视频背景分离(python实现)


    1.MeanShift原理

    (1)严格来说该方法并不是用来对图像进行分割的,而是在彩色层面的平滑滤波;
    (2)它会中和色彩分布相近的颜色,平滑色彩细节,侵蚀掉那些面积较小的颜色区域;
    (3)它以图像上任一点P为圆心,半径为sp,色彩幅值为sr进行不断的迭代;

    pyrMeanShiftFiltering(src, sp, sr, dst=None, maxLevel=None, termcrit=None):
    
    • 1

    Src:输入的原始图像;
    Sp:双精度半径,值越大,模糊程度越大;
    Sr:色彩的幅值变化范围,变化范围越大,连成一片区域的也就是越大。
    Dst:输出的图像;
    maxLevel:默认值为1;
    Termcrit:终止标准:何时停止meanshift迭代。

    import os
    import cv2
    import numpy as np
    
    img=cv2.imread('images/lenna.png')
    img=cv2.resize(src=img,dsize=(450,450))
    #图像分割
    dst=cv2.pyrMeanShiftFiltering(src=img,sp=20,sr=30)
    #图像分割(边缘的处理)
    canny=cv2.Canny(image=dst,threshold1=30,threshold2=100)
    #查找轮廓
    conturs,hierarchy=cv2.findContours(image=canny,mode=cv2.RETR_EXTERNAL,method=cv2.CHAIN_APPROX_SIMPLE)
    #画出轮廓
    cv2.drawContours(image=img,contours=conturs,contourIdx=-1,color=(0,255,0),thickness=3)
    
    cv2.imshow('img',img)
    cv2.imshow('dst',dst)
    cv2.imshow('canny',canny)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    if __name__ == '__main__':
        print('Pycharm')
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    在这里插入图片描述
    Canny边缘检测算法:
    https://mydreamambitious.blog.csdn.net/article/details/125116318
    图像查找findHomography:
    https://mydreamambitious.blog.csdn.net/article/details/125385752


    2.视频前后景分离

    (1)MOG2去除背景

    在createBackgroundSubtractorMOG的基础上进行了改进;

    混合高斯模型为基础的前景或者背景分割算法

    createBackgroundSubtractorMOG2(history=None, varThreshold=None, detectShadows=None):
    
    • 1

    History:进行建模的需要多长的参考帧,默认值为200;
    varThreshold:判断背景模型是否能很好地描述像素。
    detectShadows:阴影检测;

    import os
    import cv2
    import numpy as np
    
    #打开摄像头
    cap=cv2.VideoCapture('video/University_Traffic.mp4')
    #创建前景分离对象
    bgsegment=cv2.createBackgroundSubtractorMOG2()
    
    while cap.isOpened():
        OK,frame=cap.read()
        if OK==False:
            break
        frame=cv2.resize(src=frame,dsize=(500,500))
        fgmask=bgsegment.apply(frame)
        cv2.imshow('img',fgmask)
    
        if cv2.waitKey(1)&0xFF==27:
            break
    
    cap.release()
    cv2.destroyAllWindows()
    
    if __name__ == '__main__':
        print('Pycharm')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    在这里插入图片描述

    从视频帧中可以看到MOG2产生了很多的噪点,所以对此提出了改进的方法:
    GMG去除背景的方法:
    静态背景图估计和每个像素的贝叶斯分割抗噪性更强;

  • 相关阅读:
    零样本学习&Domain-aware Visual Bias Eliminating for Generalized Zero-Shot Learning
    前端设计模式之【中介模式】
    UE5学习笔记 判断物体是否在相机视野内
    【Harmony OS】【ARK UI】公共事件模块
    【Rancher】Rancher 2.6.x 搭建Kubernetes集群
    IP协议总结
    超美!ChatGPT DALL-E 3已可用,另外GPT-4可上传图片进行问答
    Linux驱动开发笔记
    函数相乘和相除的导数及证明
    21天学Python --- 打卡7:Spider爬虫入门
  • 原文地址:https://blog.csdn.net/Keep_Trying_Go/article/details/125451244