如果您有一堆坏点,您当前的方法将无济于事。根据用于测试屏幕的图像,它还可能将卡住的像素(具有 100% 强度的像素)误解为有效像素,将周围的像素误解为缺陷。
而是计算数据的总体平均值 µ 和方差 σ 2并将数据解释为正态分布。根据68-95-99.7 规则,95% 的数据应该在区间 [µ-2σ,µ+2σ] 内。
让我们看看您的样本并确定这是否适用于您的数据:
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%)显露出来。请注意,我还添加了一个强度非常高的像素,这可能会卡住:
值为 5000 的条目 0 可能已死
值为 1135 的条目 12 可能已死
但是,有一个主要缺点,因为这种方法只有在屏幕同样照明的情况下才有效。如果您使用纯白色图像记录强度图,则也无法检测到滞留像素。而且,当然,如果您的数据因为屏幕完全损坏而分散,那么这种方法对您没有帮助。除此之外,它很容易实现。您还可以添加本地检查以过滤误报。
请注意,此算法的固定运行时间为3*n
.
(该图由Mwtoews创建)