2010-08-06 8 views
7

Estoy haciendo algo de procesamiento de imágenes, y estoy tratando de realizar un seguimiento de puntos similares a los que aparecen en un círculo, un punto muy oscuro de un par de píxeles de diámetro, con todos los vecinos los píxeles son brillantes. Estoy seguro de que hay algoritmos y métodos que están diseñados para esto, pero simplemente no sé lo que son. No creo que la detección de bordes funcione, ya que solo quiero los puntos pequeños. He leído un poco sobre los operadores morfológicos, ¿podrían ser estos un enfoque adecuado?Cómo detectar puntos que son drásticamente diferentes a sus vecinos

Gracias

wavelet filtered image

+0

¿Está buscando solamente puntos oscuros sobre fondo brillante o también opuesto (puntos brillantes sobre fondo oscuro)? –

Respuesta

1

Personalmente me gusta este manual corner detection algorithms.

También puedes entrenar el algoritmo de detección de esquinas ingenua explotando la idea de que el pixel aislado es ese pixel a través del cual la intensidad cambia drásticamente en todas las direcciones. Es solo una idea inicial para comenzar y avanzar hacia mejores algoritmos.

+0

404 en el enlace ahora, aquí está la página de wikipedia para detección de esquina (no tengo manera de saber si cubre información similar al artículo vinculado): https: // es. wikipedia.org/wiki/Corner_detection – dtudury

5

bucle por encima de su cada píxel de la imagen. Cuando haya terminado de considerar un píxel, márquelo como "usado" (cámbielo a algún valor centinela, o mantenga estos datos en una matriz separada paralela a la imagen).

Cuando se encuentra con un píxel oscuro, realice un flood-fill en él, marcando todos esos píxeles como "usados" y controle cuántos píxeles se rellenaron. Durante el llenado de inundación, asegúrese de que si el píxel estás considerando que no es oscuro, que es lo suficientemente brillante.

Después del llenado de inundación, sabrá el tamaño del área oscura que rellenó y si el borde del relleno fue exclusivamente píxeles brillantes. Ahora, continúe con el bucle original, omitiendo los píxeles "usados".

+0

Ese es un buen enfoque, lo intentaré – Simonw

2

¿Estás seguro de que no quieres hacer un enfoque similar a la detección de bordes? Parece que una comparación del píxel actual con el valor promedio de los píxeles del vecindario haría el truco. (Evaluaría varios tamaños de barrio para estar seguro.)

0

Han pasado unos años desde que realicé el procesamiento de imágenes. Pero probablemente comenzaría convirtiendo a una representación binaria. No parece que estés demasiado interesado en los valores medios grises, solo en las regiones muy oscuras/muy claras, así que deshazte de todo el gris. En ese punto, varias operaciones morfológicas pueden acentuar los puntos que le interesan. La apertura y el cierre son bastante fáciles de implementar y pueden producir resultados bastante buenos, dejándote con un campo de negro en todas partes, excepto en los puntos que te interesan.

3

¿Qué tal algún tipo de filtrado medio? Muestra los valores de la cuadrícula 3 * 3 (o algún otro tamaño adecuado) alrededor del píxel y establece el valor del píxel en la mediana de esos 9 píxeles.

Entonces, si la mayoría de los vecinos son brillantes el píxel se convierte en brillante etc.

Editar: Después de pensar un poco, me di cuenta de que esto no va a detectar los valores extremos, será eliminarlos. Entonces esta no es la solución que el cartel original estaba pidiendo.

1

de hecho voy a sugerir simple plantilla coincidencia para esto, si todas sus características son aproximadamente del mismo tamaño.

Copie y pegue los píxeles de una (o algunas funciones) para crear algunas plantillas, y luego use la Correlación cruzada normalizada o cualquier otra puntuación que OpenCV proporcione en sus rutinas de coincidencia de plantillas para buscar regiones similares.En el resultado, detecte todos los picos máximos de la respuesta (OpenCV también tiene una función para esto), y esas son sus coordenadas de característica.

0

¿Ha intentado extraer componentes conectados usando cvContours? Primer umbral de la imagen (utilizando el método de Otsu, por ejemplo) y luego extraer cada contorno. Como los puntos que desea rastrear son (por lo que veo en su imagen) algo aislados del vecindario, algunos lo harán como contornos separados. Ahora, si calculamos el área del rectángulo delimitador de cada contorno y filtramos los más grandes, nos quedarían solo pequeños puntos separados de los vecinos oscuros. Como se sugirió anteriormente, un poco de retoque morfológico antes de la separación del contorno debería dar buenos resultados.

0

Desenfoque (3x3) una copia de la imagen y luego difiera la imagen original. Los píxeles con los valores más altos son los que son más diferentes de sus vecinos. Esto podría usarse como un algoritmo de detección de bordes, pero los puntos son como super bordes, así que configure su umbral más alto.

what a single off pixel looks like: 
(assume surrounding pixels are all 1) 

original blurred   diff 
1,1,1  8/9,8/9,8/9  1/9,1/9,1/9 
1,0,1  8/9,8/9,8/9  1/9,8/9,1/9 
1,1,1  8/9,8/9,8/9  1/9,1/9,1/9 


what an edge looks like: 
(assume surrounding pixels are the same as their closest neighbor) 

original blurred   diff 
1,0,0  6/9,3/9,0/9  3/9,3/9,0/9 
1,0,0  6/9,3/9,0/9  3/9,3/9,0/9 
1,0,0  6/9,3/9,0/9  3/9,3/9,0/9 
Cuestiones relacionadas