2012-07-30 23 views
6

Estoy tratando de crear un algoritmo que detecta y cuenta los píxeles muertos de un mapa de intensidad en formato .csv. Mi enfoque actual es dividir el valor del píxel que estoy probando por el valor del píxel inmediatamente a la derecha (o, si está en el extremo derecho, el que está a la izquierda). Si el dividendo es menor que algún umbral (actualmente .9), entonces lo marco como un pixel muerto.Algoritmo para encontrar píxeles muertos en Javascript

Mi pregunta es, ¿hay una manera mejor/más eficiente de calcular si un píxel está muerto?

de muestra de salida 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 

En este ejemplo, el píxel medio sería un pixel "muerto".

+2

@Jay: "[...] que detecta y cuenta los píxeles muertos de un mapa de intensidad". Supongo que tiene los datos necesarios. Cómo lo obtuvo y si es correcto está sujeto a otra pregunta, sin embargo, también puede interpretar esta pregunta como "cómo obtener campos cuyos valores están por debajo del promedio local". – Zeta

+1

@Jay: Probablemente estés pensando en los píxeles del monitor; Creo que el OP está pensando en los píxeles del sensor (cámara digital, etc.) –

Respuesta

2

Eficiencia

Tendrá que mirar a cada píxel al menos una vez por lo que no hay manera de que su tiempo de funcionamiento nunca puede superar la corriente O(n), donde n es el número de píxeles. Su algoritmo usa una cantidad constante de memoria, que también es óptima.

Sin embargo, no estoy seguro de que su algoritmo sea siempre correcto. ¿Tiene alguna forma de evitar la comparación de píxeles muertos consecutivos? Ejemplo de entrada:

3183 3176 1135 1135 3212 
       ^Not detected 

una manera más precisa

Asumo que tome la intensidad del píxel vecino para evitar la comparación de píxeles que se encuentran en diferentes zonas de la pantalla ya que el brillo de la pantalla no podría ser distribuido uniformemente

Un enfoque para evitar falsos negativos es tomar el promedio de varios píxeles cercanos, pero esto podría no funcionar si hay muchos píxeles muertos en el área. Puede tratar de tomar el valor máximo de todos los píxeles en un área pequeña. De esta forma, siempre que un solo píxel en toda el área no esté muerto, se detectarán todos los píxeles muertos.

Cuantos píxeles muestra se determinará por su tolerancia a los falsos negativos.

+0

Referencia: * ¿Tiene alguna manera de evitar la comparación de píxeles muertos consecutivos? * Supongo que un segundo pase funcionaría, y tal vez para apuntar ese segundo pase en el detectado mala ubicación de píxeles. – arttronics

1

Parece probable que pueda tener una transición brusca legítima de clara a oscura o viceversa en una imagen real: una línea de sombra nítida que pasa al sol brillante o solo al borde de un objeto blanco sobre un fondo negro. Por lo tanto, mirar solo el píxel a la derecha podría generar fácilmente algunos falsos positivos.

Lo que sería menos probable que genere un falso positivo sería comparar un píxel con al menos cada uno de los cuatro píxeles que lo rodean (arriba, abajo, izquierda, derecha). Permitiría una gran diferencia entre un píxel y dos de los cuatro vecinos, pero no una gran diferencia entre un píxel y los cuatro vecinos, ya que esa singularidad de píxel en una imagen real sería muy poco probable.

Incluso podría eliminar los falsos positivos si necesitara que un píxel fallara su prueba en múltiples imágenes separadas (de diferentes sujetos).

En cuanto a los detalles de cómo hacer este cálculo, puede hacer algo como usted ya propuso, pero compare con los cuatro vecinos o una búsqueda en Google de "algoritmo de detección de píxeles muertos" produce una serie de artículos sobre diversas ideas .

2

Su enfoque actual no lo ayudará si tiene un grupo de píxeles muertos. También puede malinterpretar un píxel pegado (píxel con una intensidad del 100%) como un píxel válido y el píxel circundante como un defecto, según la imagen que se usó para probar la pantalla.

En su lugar, calcule el promedio general μ y la varianza σ de sus datos e interprete los datos como normal distributed. Según el 68-95-99.7 rule, el 95% de todos los datos debe estar en el intervalo [μ-2σ, μ + 2σ].

Standard derivation diagram

Vamos a echar un vistazo a la muestra y determinar si esto es cierto para sus datos:

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"); 
} 

Esto dará lugar a los píxeles muertos (8% del total de píxeles) reveló. Tenga en cuenta que también añadí un píxel con una intensidad muy alta, lo que probablemente se ha quedado atascado:

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

Sin embargo, hay un inconveniente importante, ya que este enfoque sólo funcionará si la pantalla iluminada por igual. Tampoco se puede detectar el pixel atascado si grabó el mapa de intensidad con una imagen blanca normal. Y, por supuesto, si sus datos están dispersos porque la pantalla está completamente rota, este enfoque no lo ayudará. Aparte de eso, es fácil de implementar. También podría agregar un cheque local para filtrar falsos positivos.

Tenga en cuenta que este algoritmo tiene un tiempo de ejecución fijo de 3*n.

(El diagram ha sido creado por Mwtoews)

-1

si esto es una cuestión de la vida real (y estamos hablando de píxeles muertos en una cámara):

de unos 5 fotos. si un píxel tiene una intensidad significativamente diferente de la de sus vecinos (es decir, el promedio del bloque de 11x11, compare el RGB por separado) en la mayoría de las imágenes, es casi seguro que está muerto/atascado.

+0

Esto no responde la pregunta. El OP está buscando una forma * programática * para encontrar esto, y no hay valores RGB, solo valores de intensidad. Por favor, vuelva a leer la pregunta con cuidado. – Matt

+0

@Matt ugh, no le digo al OP que lo haga a mano, lea mi respuesta cuidadosamente :) Tomar varias fotos seguramente ayudará a determinar si un píxel está realmente muerto, una imagen podría ser un golpe de suerte. No me di cuenta de que se debe abstenerse de pensar de manera original. – maniek

Cuestiones relacionadas