6

我正在尝试创建一种算法,该算法可以从 .csv 格式的强度图中检测和计算坏点。我目前的方法是将我正在测试的像素的值除以右侧的像素值(或者,如果在最右侧,则为左侧的像素值)。如果股息小于某个阈值(当前为 0.9),那么我将其标记为坏点。

我的问题是,是否有更好/更有效的方法来计算像素是否死了?

示例 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

在此示例中,中间像素将是“死”像素。

4

4 回答 4

2

效率

您需要至少查看每个像素一次,因此您的运行时间不可能超过当前的O(n),其中 n 是像素数。您的算法使用恒定数量的内存,这也是最佳的。

但是,我不确定您的算法是否总是正确的。你有办法避免比较连续的坏点吗?示例输入:

3183    3176    1135    1135    3212
                ^ Not detected

更准确的方法

我假设您采用相邻像素的强度以避免比较屏幕不同区域中的像素,因为屏幕的亮度可能不会均匀分布。

避免误报的一种方法是取附近几个像素的平均值,但如果该区域中有很多坏像素,这可能不起作用。您可以尝试从一个小区域中的所有像素中取出最大值。这样,只要整个区域中的单个像素没有坏点,就会检测到所有坏点。

您采样的像素数将取决于您对假阴性的容忍度。

于 2012-07-30T07:56:36.310 回答
2

如果您有一堆坏点,您当前的方法将无济于事。根据用于测试屏幕的图像,它还可能将卡住的像素(具有 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创建)

于 2012-07-30T08:10:47.230 回答
1

在真实图像中,您似乎可以有一个从亮到暗的合理急剧过渡,反之亦然 - 一条清晰的阴影线过渡到明亮的太阳,或者只是黑色背景下的白色物体的边缘。所以,只看右边的像素很容易产生一些误报。

不太可能产生误报的方法是将一个像素与其周围的至少四个像素(上、下、左、右)进行比较。您将允许一个像素与四个相邻像素中的两个存在明显差异,但不允许一个像素与所有四个相邻像素之间存在明显差异,因为真实图像中的一个像素奇点不太可能出现。

如果您需要一个像素在多个单独的图像(不同主题)中未能通过测试,您甚至可以进一步消除误报。

至于如何进行此计算的详细信息,您可以像您已经提出的那样做一些事情,但是与所有四个邻居进行比较,或者在 Google 搜索“死像素检测算法”会产生大量关于各种想法的文章。

于 2012-07-30T07:56:46.540 回答
-1

如果这是一个现实生活中的问题(我们正在谈论相机中的坏点):

拍摄大约 5 张照片。如果在大多数图片中一个像素与它的邻居有显着不同的强度(fe 11x11 块的平均值,分别比较 RGB),它几乎肯定是死/卡住了。

于 2012-07-30T21:42:38.883 回答