2012-07-30 60 views
6

我正在嘗試創建一種算法,以.csv格式從強度圖中檢測並計算壞點。我目前的做法是將我正在測試的像素的值與像素值立即分配到右側(或者,如果在最右側,則向左)。如果股息少於某個臨界值(當前.9),那麼我將其標記爲壞點。在Javascript中查找壞點的算法

我的問題是,有沒有更好/更有效的方法來計算像素是否已經死亡?

CSV輸出示例:

3183 3176 3207 3183 3212 
3211 3197 3198 3183 3191 
3193 3177 1135 3185 3176 
3175 3184 3188 3179 3181 
3181 3165 3184 3187 3183 

在這個例子中,中間的像素將是一個 「死」 像素。

+2

@Jay:「[...]檢測並計算強度圖中的壞點。」我想他有必要的數據。他如何得到它,是否正確還有另一個問題,但是你也可以把這個問題解釋爲「如何得到值低於當地平均值的區域」。 – Zeta 2012-07-30 07:37:37

+1

@Jay:你可能在想像顯示器像素;我認爲OP在考慮傳感器像素(數碼相機等) – 2012-07-30 08:18:25

回答

2

效率

你需要在每個像素看起來至少一次,所以沒有辦法的運行時間都不能戰勝當前O(n),其中n是像素數。你的算法使用恆定的內存量,這也是最優的。

但是,我不確定你的算法總是正確的。 你有避免比較連續壞點的方法嗎?例如輸入:

3183 3176 1135 1135 3212 
       ^Not detected 

更準確地

我假設你把相鄰像素的強度,以避免比較是在屏幕的不同區域的像素,因爲屏幕的亮度可能不均勻分佈。

避免誤報的一種方法是取附近幾個像素的平均值,但如果該區域有很多壞點,則可能無法正常工作。您可以嘗試從小區域中的所有像素中取出最大值。這樣,只要整個區域的單個像素沒有死,所有的壞點都會被檢測到。

您抽樣的像素數量取決於您對漏報的容忍度。

+0

參考:*您是否有避免比較連續壞點的方法?*我想第二次通過會起作用,並且可能將第二次通過檢測到壞像素位置。 – arttronics 2012-07-30 08:22:37

1

在真實圖像中,看起來您可能會從光明到黑暗或副反射的正常急劇轉變 - 銳利的陰影線轉換爲明亮的太陽或只是黑色背景上的白色物體的邊緣。所以,只看到右側的像素很容易產生一些誤報。

產生誤報的可能性較小的是將像素與周圍四個像素(上方,下方,左側,右側)中的至少每個像素進行比較。你可以在一個像素和四個鄰居中的兩個之間做出明顯的差異,但是在一個像素和所有四個鄰居之間不會有明顯的差異,因爲真實圖像中的一個像素奇點是不太可能的。

如果您需要像素在多個單獨圖像(不同主體)中測試失敗,則您甚至可以進一步消除誤報。

至於細節如何做這個計算,你可以做一些像你已經提出的東西,但比較所有四個鄰居或谷歌搜索「壞點檢測算法」產生各種想法的文章主機。

2

如果你有一簇壞點,你目前的做法不會對你有所幫助。它也可以將卡住的像素(具有100%強度的像素)誤解爲有效像素,並且將周圍像素視爲缺陷,這取決於用於測試畫面的圖像。

而是計算您的數據的整體平均值μ和方差σ並將數據解釋爲normal distributed。根據68-95-99.7 rule 95%的數據應該在[μ-2σ,μ+2σ]區間內。

Standard derivation diagram

讓我們來看看你的樣品,並確定這是否爲您的數據真實:

var arr = "5000 3176 3207 3183 3212 3211 3197 3198 3183 3191 3193 3177 1135 3185 3176 3175 3184 3188 3179 3181 3181 3165 3184 3187 3183".split(" "); 
var i = 0; 
var avg = 0; // average/mean 
var vri = 0; // variance 
var sigma; // sqrt(vri) 

for(i = 0; i < arr.length; ++i){ 
    arr[i] = parseInt(arr[i]); 
    avg += arr[i]; 
} 
avg /= arr.length; 

for(i = 0; i < arr.length; ++i){ 
    vri += (arr[i]-avg)*(arr[i]-avg); 
} 
vri /= (arr.length - 1); 
sigma = Math.sqrt(vri); 

for(i = 0; i < arr.length; ++i){ 
    if(Math.abs(arr[i]-avg) > 2*sigma) 
     console.log("entry "+i+" with value "+arr[i]+" probably dead"); 
} 

這將導致壞點(總像素的8%)顯示。請注意,我還添加了一個像素具有非常高的強度,這可能是卡住:

entry 0 with value 5000 propably dead 
entry 12 with value 1135 probably dead

然而,有一個主要的缺點,因爲如果屏幕亮度相同這種方法纔有效。如果您使用普通白色圖像記錄強度圖,也無法檢測到卡住的像素。當然,如果你的數據因爲屏幕完全被破壞而分散,這種方法不會對你有所幫助。除此之外,它很容易實現。您也可以添加本地檢查以過濾誤報。

請注意,該算法的固定運行時間爲3*n

(該diagram已被Mwtoews創建)

-1

如果這是現實生活中的問題(我們都在談論相機壞點):

約需5張圖片。如果一個像素與其鄰居的亮度有很大差別(f.e. 11x11塊的平均值,分別比較RGB),那麼它幾乎肯定是死的/卡住了。

+0

這不回答問題。 OP正在尋找一種* programmatic *的方式來找到這個,並且沒有RGB值,只是強度值。請仔細重讀該問題。 – Matt 2012-08-08 09:52:01

+0

@Matt唉,我沒有告訴OP手動做,仔細閱讀我的答案:)拍多張照片肯定有助於確定一個像素是否真的死了,一張照片可能是一個僥倖。我沒有意識到開箱即用的想法應該避免。 – maniek 2012-08-08 12:28:49