6

.csv形式の強度マップからドット抜けを検出してカウントするアルゴリズムを作成しようとしています。私の現在のアプローチは、テストしているピクセルの値を、すぐ右側のピクセルの値(または、右端の場合は左側のピクセル)で割ることです。配当があるしきい値(現在は.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

効率

少なくとも 1 回は各ピクセルを確認する必要があるため、実行時間が現在のO(n) (nはピクセル数)を超えることはありません。アルゴリズムは一定量のメモリを使用しますが、これも最適です。

ただし、アルゴリズムが常に正しいかどうかはわかりません。連続するデッド ピクセルの比較を回避する方法はありますか? 入力例:

3183    3176    1135    1135    3212
                ^ Not detected

より正確な方法

画面の明るさが均等に分布していない可能性があるため、画面の異なる領域にあるピクセルの比較を避けるために、隣接するピクセルの強度を取得すると仮定しています。

偽陰性を回避する 1 つの方法は、いくつかの近くのピクセルの平均を取ることですが、その領域に多くのデッド ピクセルがある場合、これはうまくいかない可能性があります。小さな領域のすべてのピクセルから最大値を取得してみてください。このようにして、領域全体の 1 つのピクセルがデッド ピクセルでない限り、すべてのデッド ピクセルが検出されます。

サンプリングするピクセル数は、偽陰性に対する許容度によって決まります。

于 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 はおそらく死んでいる

ただし、このアプローチは画面が均等に照らされている場合にのみ機能するため、大きな欠点が 1 つあります。また、無地の白い画像で強度マップを記録した場合、スタック ピクセルは検出できません。もちろん、画面が完全に壊れているためにデータが散らばっている場合、このアプローチは役に立ちません。それ以外は簡単に実装できます。ローカル チェックを追加して、誤検知をフィルタリングすることもできます。

このアルゴリズムのランタイムは固定であることに注意してください3*n

(図はMwtoewsによって作成されました)

于 2012-07-30T08:10:47.230 に答える
1

実際の画像では、明から暗へ、またはその逆への正当な鋭い移行 (明るい太陽に移行する鋭い影の線、または黒い背景に対する白いオブジェクトのエッジだけ) が存在する可能性が高いようです。そのため、右側のピクセルだけを見ると、誤検知が簡単に発生する可能性があります。

偽陽性を生成する可能性が低いのは、ピクセルを少なくともその周囲の 4 つのピクセル (上、下、左、右) のそれぞれと比較することです。1 つのピクセルと 4 つの隣接ピクセルのうちの 2 つとの間の急激な違いは許容されますが、1 つのピクセルと 4 つの隣接ピクセルすべてとの間の明確な違いは許容されません。

複数の別々の画像 (異なる対象の) でピクセルがテストに失敗する必要がある場合は、誤検知をさらに排除できます。

この計算を行う方法の詳細については、既に提案したようなことを行うことができますが、4 つの近隣すべてと比較するか、Google で「デッド ピクセル検出アルゴリズム」を検索すると、さまざまなアイデアに関する多くの記事が得られます。

于 2012-07-30T07:56:46.540 に答える
-1

これが実際の質問である場合 (カメラのデッド ピクセルについて話している場合):

5枚ほど撮影。ほとんどの写真でピクセルの強度が隣接するピクセルと大幅に異なる場合 (fe 11x11 ブロックの平均、RGB を個別に比較)、ほぼ確実にデッド/スタックしています。

于 2012-07-30T21:42:38.883 に答える