當(dāng)我們要把一幅圖像中的運(yùn)動(dòng)區(qū)域和靜止區(qū)域區(qū)分開(kāi)的時(shí)候漓摩,這樣的任務(wù)在計(jì)算機(jī)視覺(jué)中稱為前后景分離调衰,而幀差法則是前后景分離中最簡(jiǎn)單的一種方法膊爪,單純考慮像素值在空間上的變化而不考慮時(shí)間特性。
對(duì)于兩幀幀差法的計(jì)算過(guò)程可以用一句話描述:對(duì)于某個(gè)像素嚎莉,如果它在前后兩幅圖像中的差值的絕對(duì)值超過(guò)某個(gè)設(shè)定好的閾值米酬,則認(rèn)為它屬于前景,否則認(rèn)為它屬于背景趋箩。
具體的Python代碼如下赃额,使用了numpy和opencv:
設(shè)定閾值為50加派,對(duì)兩幅實(shí)例圖像處理的結(jié)果如下:
理想情況下,我們得到的掩碼圖應(yīng)該是中間擋住lena的一整塊全白跳芳,這是因?yàn)橛行┫袼攸c(diǎn)差值依然小于閾值芍锦,造成了一些“空洞”,在實(shí)際應(yīng)用中會(huì)帶來(lái)問(wèn)題飞盆,但也只能用如膨脹之類的方法減小這些空洞娄琉。
即使存在需要人為設(shè)定閾值和會(huì)造成空洞這樣的問(wèn)題,也不能阻止我們用它來(lái)做一些應(yīng)用吓歇。比如在你家安置這樣一個(gè)攝像頭孽水,在你離開(kāi)的這段時(shí)間,如果檢測(cè)到一大片移動(dòng)區(qū)域(掩碼圖中白色的像素值占全圖的比例很高)照瘾,那么就可以觸發(fā)一些異常報(bào)警匈棘。其實(shí)很多市場(chǎng)上的智能攝像頭的移動(dòng)偵測(cè)功能就是這么做的。
其實(shí)幀差法在我個(gè)人的工作中更多是一個(gè)預(yù)處理的手段析命,比如我會(huì)對(duì)掩碼圖中的各個(gè)連通區(qū)域做最大外接矩形把這些區(qū)域都單獨(dú)標(biāo)記出來(lái)主卫,再對(duì)每個(gè)矩形區(qū)域做其他的處理,比如判斷它是不是個(gè)人鹃愤。
最后簇搅,其實(shí)上面寫的代碼很不Python,只是為了解釋清原理寫的软吐,真正的寫法應(yīng)該這樣: