手撕演算法 LC顯著性檢測演算法

2021-10-21 00:19:35 字數 1471 閱讀 5215

顯著性檢測,顧名思義,就是提取一幅影象中的突出物件,靈感就來自於人的視覺特性,如果一張底色純白,中間一塊黑色的紙,那人眼的注意力肯定就會在黑色部分,而顯著性檢測就是計算影象的顯著性圖,突出部分顯著性圖的值就高。

顯著性檢測工作往往伴隨這其他工作,比如分割,分割可以基於顯著性檢測的結果來進行分割,進而把突出物件分割出來。

這四個演算法都特別特別簡單,而且得益於網路的發達以及前輩的總結,學起來簡直不能再容易了。

**名:

visual attention detection in video sequences using spatiotemporal cues
所以公式也就很明了了:

s§就是顯著性值,d(p,q)就是畫素p距離q的距離,i就是整幅影象。

這個顯著性檢測數學模型就是這麼簡單。

不過**卻不能直接for迴圈寫,時間複雜度會很高的,所以可以利用直方圖進行優化。

將畫素的特徵值歸一化到[0,255],如果影象是單通道,這個特徵值就是畫素灰度值。我們計算的距離也就是特徵值之間的顏色距離。然後利用直方圖對影象特徵值進行統計,得到fn,即特徵值在影象**現的次數。

這時顯著性計算公式為:

其中d(p,n)為特徵值p和n的歐氏距離。

為進一步優化,我們提前計算出每乙個d(n1,n2)。由於任何兩個畫素的特徵值都在[0,255]之間,可以提前計算距離矩陣d。這樣就可查表得到兩個畫素的特徵距離。這樣特徵值p的顯著性進一步優化為:

記錄已經計算的顯著值,避免重複計算。

該演算法缺點:

其求全域性對比度的策略會導致稀有顏色(特徵值)佔優,也就是具有較高的對比度,這在很多情況下是不合理的。所以的方法檢測效果不夠好

演算法流程:

計算影象特徵值的直方圖

遍歷影象計算特徵值距離矩陣d

為每乙個對應畫素值分配顯著值,得到顯著圖

將顯著圖歸一化到[0,255]範圍內並顯示

具體**:

void lc::calculatesaliencymap(mat *src, mat * dst)

//計算特徵顯著值並儲存到s

double s_min = dbl_max, s_max = 0;

for (int i = 0; i < 256; i++)

salimg.convertto(*dst, cv_8u, 1, 0);

}

輸入為灰度圖,輸出為顯著圖:

Cython 顯著性檢測演算法 LC

各位好 這裡是lc演算法的加速版。檢視原 之前用numpy實現lc演算法,處理一張1920 1080解析度,大小1.1m的耗時 0.12s 想著加速一下 執行速度,故使用cython包裝了一下 上面的耗時 0.08s cython版 著性檢測演算法 lc 共如下三個檔案 demo lc 02 mat...

關於顯著性檢測的思考

梳理visual saliency 的定義,視覺顯著性是乙個主觀目標,既有自上而下的任務驅動的注意機制,全域性的拓撲認知,也有自下而上的基於區域性特徵的多層次融合機制。因此顯著性也是乙個從主觀上定義,客觀上驗證該定義的視覺過程。因此顯著性的定義上從主觀上是任務驅動的視覺搜尋過程,這個過程 的是注意機...

顯著性檢測評價指標

m為二值化的顯著 圖,g為ground truth.通過設定閾值得到二值化的顯著 圖m,通過上式計算得到一對precision,recall 所有的p,r取平均 閾值取值為0 255.這樣,不同的閾值,對應不同的p r對,總共有256個p r對。以p為縱座標,r為橫座標,構成p r曲線。參考 2一般...