運動目標檢測--改進的均值濾波演算法提取畫面背景
阿新 • • 發佈:2019-01-13
背景模型提取
前提假設 在背景模型提取階段,運動目標在場景區域中運動,不會長時間停留在某一位置
視訊流中某一畫素點只有在前景運動目標通過時,它的亮度值才發生大的變化,在一段時間內,亮度值主要集中在很小的一個區域中,可以用這個區域內的平均值作為該點的背景值。具體實現過程:在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