顯著性檢測,顧名思義,就是提取一幅影象中的突出物件,靈感就來自於人的視覺特性,如果一張底色純白,中間一塊黑色的紙,那人眼的注意力肯定就會在黑色部分,而顯著性檢測就是計算影象的顯著性圖,突出部分顯著性圖的值就高。
顯著性檢測工作往往伴隨這其他工作,比如分割,分割可以基於顯著性檢測的結果來進行分割,進而把突出物件分割出來。
這四個演算法都特別特別簡單,而且得益於網路的發達以及前輩的總結,學起來簡直不能再容易了。
**名:
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一般...