运动目标检测--改进的均值滤波算法提取画面背景

版权声明:转载请声明 https://blog.csdn.net/weixin_42451919/article/details/86416291

背景模型提取

前提假设 在背景模型提取阶段,运动目标在场景区域中运动,不会长时间停留在某一位置

视频流中某一像素点只有在前景运动目标通过时,它的亮度值才发生大的变化,在一段时间内,亮度值主要集中在很小的一个区域中,可以用这个区域内的平均值作为该点的背景值。具体实现过程:在YUV颜色空间下,Y值的变化范围为0~255,将该范围划分成若干区间[0,T][T,2T]…[Nt,255],n=255/T,对于每个像素点,统计一段时间内每个区间内亮度值的出现的次数。找出出现次数最多的那个区间,将该区间内所有值的平均值作为背景模型在该点的亮度值。这种方法不受前景运动目标的影响。

def get_background(total_frame_list,fps):
    #初始化背景为第一帧
    background=np.array(total_frame_list[0])
    frames=int(2*fps)
    frames_list=[]#缓存前L 帧视频图像
    for i in range(frames):
        frames_list.append(total_frame_list[i])
    frames_list=np.array(frames_list)
    # 对于每个像素点的每一个颜色通道,先统计滑窗时间里每个区间内颜色分量值在 L 帧视频图像中出现的次数,然后
    # 计算出现次数最多的区间内所有值的平均值,并用它来作为背景模型在该点的颜色值
    for i in range(frames_list.shape[1]):  # 高
        for j in range(frames_list.shape[2]):  # 宽
            for k in range(frames_list.shape[3]): # 通道
                a = 0  # 0-51
                b = 0  # 51-102
                c = 0  # 102-153
                d = 0  # 153-204
                e = 0  # 204-255
                a_count=0
                b_count = 0
                c_count = 0
                d_count = 0
                e_count = 0
                for l in range(frames):
                    if frames_list[l ,i ,j ,k ] >= 0 and frames_list[l ,i ,j ,k ] < 51:
                        a_count += frames_list[l ,i ,j ,k]
                        a+=1
                    elif frames_list[l ,i ,j ,k ] >= 51 and frames_list[l ,i ,j ,k ] < 102:
                        b_count += frames_list[l, i, j, k]
                        b+=1
                    elif frames_list[l ,i ,j ,k ] >= 102 and frames_list[l ,i ,j ,k ] < 153:
                        c_count += frames_list[l, i, j, k]
                        c+=1
                    elif frames_list[l ,i ,j ,k ] >= 153 and frames_list[l ,i ,j ,k ] < 204:
                        d_count += frames_list[l, i, j, k]
                        d+=1
                    else :
                        e_count += frames_list[l, i, j, k]
                        e+=1
                list=[a,b,c,d,e]
                #print("height: ",i,"width: ",j,"tongdao: ",k," ",list)
                #max_value = max(list)  # 最大值
                max_index = list.index(max(list))  # 返回最大值的索引
                if max_index==0:
                    background[i, j, k] =int(a_count/a)
                elif max_index==1:
                    background[i, j, k] = int(b_count / b)
                elif max_index==2:
                    background[i, j, k] = int(c_count / c)
                elif max_index==3:
                    background[i, j, k] = int(d_count / d)
                else :
                    background[i, j, k] = int(e_count / e)
    print("background.shape: ",background.shape)
    # cv2.imshow("bg", background)
    # cv2.waitKey()
    # cv2.destroyAllWindows()
    return background

猜你喜欢

转载自blog.csdn.net/weixin_42451919/article/details/86416291
今日推荐