2012-02-13 13 views
6

En lugar de detección de bordes de una imagen 2D, me gustaría detectar los bordes en cada fila (por ejemplo, una línea) de una imagen por separado. Esa es la detección de bordes de un vector de 1D de entrada cuyos valores son intensidades de los píxeles que van de 0 a 255 (imagen de abajo): enter image description hereDetección de bordes unidimensionales

quisiera detectar los bordes principales como aparece en la entrada de la muestra (imagen inferior) enter image description here

+0

Gracias a todos por las respuestas. Por favor, si encuentras más ideas nuevas (1 detecciones de bordes dimensionales), comparte eso también aquí. –

Respuesta

7

Una forma de llegar a su resultado deseado es adaptar el detector de bordes de Canny 2D como sigue (código en Mathematica):

En primer lugar, calcular la derivada espacial utilizando un filtro derivado de Gauss, estableciendo el valor de sigma con respecto a la escala de los bordes que quiere detectar Toma el valor absoluto del resultado.

d = [email protected][data, {{10, 5}}, 1]; 

Entonces, determinar un umbral automáticamente a agruparse los valores derivados anteriores en dos grupos (aquí utilizando el método de Otsu).

thrd = FindThreshold[d]; 

Luego, detecte los pasos de los valores derivados (transiciones hacia/desde la "banda muerta").

steps = [email protected]`StepDetect[d, thrd]["NonzeroPositions"]; 

En este punto usted tiene los extremos de los bordes:

ListLinePlot[data, Epilog -> {Red, PointSize[Large], Map[Point[{#, data[[#]]}] &, steps]}] 

enter image description here

Opcionalmente - parece que es lo que desea - a mantener sólo los extremos más bajos de la bordes. Agrupar los puntos de datos en los extremos de los bordes funciona en este caso, pero no estoy seguro de cuán robusto es.

t = [email protected][[steps]]; 
steps2 = Select[steps, data[[#]] <= t &]; 

ListLinePlot[data, Epilog -> {Red, PointSize[Large], Map[Point[{#, data[[#]]}] &, steps2]}] 

enter image description here

2

¿Está buscando un cambio particular en la pendiente, es decir, un cierto cambio en Y por muestra?

¿No se trata simplemente de observar la diferencia en Y entre dos muestras y si su valor absoluto ha cambiado más de un límite, marcarlo como un borde?

+0

No, realmente, no sería tan simple en absoluto. Para obtener más información, consulte: http://en.wikipedia.org/wiki/Edge_detection (Por qué la detección de bordes es una tarea no trivial) –

+0

@Cgraphics: en las imágenes que publicó una diferencia simple o derivada del operador gaussiano debería funcionar bien . Si cree que "no es para nada sencillo", publique los datos reales con los que tiene problemas. – Niki

+0

@nikie esa es la imagen real, sin embargo, tampoco es tan simple como aplicar un umbral simple. Necesitamos una detección precisa de los bordes no solo, por ejemplo, contarlos. –

1

Dado el buen contraste de estos bordes, no es una solución fácil que funcionará robustamente: detectar todas las secuencias monótonas de valores de píxel (estrictamente creciente o decreciente). Deberá mantener las secuencias con una altura total por encima de un umbral (50 en su caso) para rechazar los picos ruidosos.

Como subproducto, obtendrá los puntos inicial y final (no exactamente donde los espera, pero esto se puede mejorar si es necesario).

¿Códigos de barras?

+0

No salga exactamente, sin embargo, puede pensarlo como código de barras de color –

Cuestiones relacionadas