2010-08-06 97 views
7

我正在做一些圖像處理,並且試圖跟蹤類似於以下圈出的點,這是一個非常暗的點,直徑爲幾個像素,與所有相鄰點像素點亮。我確信有爲此設計的算法和方法,但我只是不知道它們是什麼。我不認爲邊緣檢測會起作用,因爲我只想要小點。我已經讀了一些關於形態操作符的信息,這些可能是一種合適的方法嗎?如何檢測與其鄰居完全不同的點

感謝

wavelet filtered image

+0

你是隻看明亮的背景上的黑點還是對面的(黑點背景上的亮點)? – 2010-08-29 18:48:50

回答

1

我個人喜歡這個corner detection algorithms手冊。

此外,您還可以通過利用隔離像素是這樣的像素,通過其強度在每個方向劇烈變化的想法來鍛鍊天真的角點檢測算法。這只是一個開始的想法,從更進一步的算法開始。

+0

404現在鏈接, 這裏是角點檢測的維基百科頁面(我無法知道它是否包含與鏈接文章類似的信息):https:// en。 wikipedia.org/wiki/Corner_detection – dtudury 2015-12-01 19:39:02

5

循環在你的映像中的每個像素。當你考慮一個像素時,將其標記爲「已使用」(將其更改爲某個標記值,或將此數據保存在與圖像平行的單獨陣列中)。

當你遇到一個暗像素時,在其上執行一個flood-fill,將所有這些像素標記爲「已用」,並跟蹤填充了多少像素。在填充填充期間,確保像素你正在考慮的不是黑暗,它是足夠光明的。

在填充洪水之後,您將知道填充的黑暗區域的大小以及填充邊界是否僅爲明亮像素。現在,繼續原始循環,跳過「已用」像素。

+0

這是一個不錯的方法,我會嘗試 – Simonw 2010-08-06 16:59:06

2

你確定你不想做類似邊緣檢測的方法嗎?看起來像是將當前像素與鄰域像素的平均值進行比較就可以實現。 (我會評估各種社區規模肯定。)

0

它已經幾年了,因爲我做任何圖像處理。但我可能會先轉換爲二進制表示。它似乎並不像你對灰色中間值過度興趣,只是非常黑暗/非常亮的區域,所以擺脫所有的灰色。在這一點上,各種形態操作可以突出你感興趣的點。打開和關閉操作非常容易實現,並且可以產生相當不錯的結果,除了感興趣的點外,您還可以在任何地方使用黑色字段。

3

某種中值濾波怎麼樣?從像素周圍的3 * 3網格(或其他合適的大小)採樣值,並將像素值設置爲這9個像素的中值。

然後如果大多數鄰居都亮的像素越亮等

編輯:經過一番思考,我意識到這將不會檢測離羣值,它會刪除它們。所以這不是原創海報問的解決方案。

1

實際上,我會建議簡單的模板如果您的所有功能的尺寸大致相同,則爲此匹配。

只需複製粘貼一個(或幾個功能)的像素以創建少量模板,然後使用規範化交叉相關或OpenCV在其模板匹配例程中提供的任何其他分數來查找類似區域。在結果中,檢測響應的所有最大峯值(OpenCV也有此功能),這些都是您的要素座標。

0

您是否嘗試過使用cvContours提取連接的組件?首先對圖像進行閾值處理(使用Otsu的方法),然後提取每個輪廓。由於你想跟蹤的景點(從我看到的圖像中看)與鄰域有點隔離,因此它們會有一些獨立的輪廓。現在,如果我們計算每個輪廓的邊界矩形區域並過濾出較大的區域,我們只剩下與黑暗鄰居分離的小點。如之前所建議的,在輪廓分離之前進行一些形態修補應該會產生良好的結果。

0

模糊(3x3)您的圖像的副本,然後區別您的原始圖像。具有最高值的像素是與其鄰居差異最大的像素。這可以用作邊緣檢測算法,但點像超邊緣,因此將閾值設置得更高。

what a single off pixel looks like: 
(assume surrounding pixels are all 1) 

original blurred   diff 
1,1,1  8/9,8/9,8/9  1/9,1/9,1/9 
1,0,1  8/9,8/9,8/9  1/9,8/9,1/9 
1,1,1  8/9,8/9,8/9  1/9,1/9,1/9 


what an edge looks like: 
(assume surrounding pixels are the same as their closest neighbor) 

original blurred   diff 
1,0,0  6/9,3/9,0/9  3/9,3/9,0/9 
1,0,0  6/9,3/9,0/9  3/9,3/9,0/9 
1,0,0  6/9,3/9,0/9  3/9,3/9,0/9