1. 程式人生 > >運動目標檢測--改進的均值濾波演算法提取畫面背景

運動目標檢測--改進的均值濾波演算法提取畫面背景

背景模型提取

前提假設 在背景模型提取階段,運動目標在場景區域中運動,不會長時間停留在某一位置

視訊流中某一畫素點只有在前景運動目標通過時,它的亮度值才發生大的變化,在一段時間內,亮度值主要集中在很小的一個區域中,可以用這個區域內的平均值作為該點的背景值。具體實現過程:在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