Un problema que discutí originalmente aquí ha evolucionado, y podría haberse vuelto un poco más simple a medida que lo estudiaba un poco más y obtenía nueva información.
En pocas palabras, me gustaría poder detectar este patrón que se muestra aquí, utilizando técnicas de procesamiento de imágenes / visión por computadora. Como puede ver, el patrón ideal está compuesto por cuatro 'pings'. El reconocimiento de objetos debe ser:
- Shift Invariant
- Horizontalmente, la imagen será cíclica. (es decir, empujar a la derecha, sale a la izquierda y viceversa).
- (Afortunadamente) Verticalmente, no es cíclico. (es decir, presione hacia arriba o hacia abajo y se detendrá).
- Escala Invariante (Los pings pueden variar en 'grosor' como puede ver).
Podría seguir y seguir al respecto, pero he adjuntado imágenes que cubren lo que quiero decir, vea a continuación:
Por supuesto, también pueden estar en una 'escala' diferente, como se puede ver en esta familia:
Y finalmente, aquí hay algunos escenarios 'realistas' de lo que realmente podría recibir, donde habría ruido, las filas podrían 'desvanecerse' a medida que avanza hacia la parte inferior y, por supuesto, la imagen tendrá muchas líneas espurias, artefactos etc.
Y, por supuesto, como gran final, existe la posibilidad clara de este escenario 'extremo':
Entonces, una vez más, me gustaría pedir una guía sobre qué técnicas de visión artificial por computadora debería utilizar aquí para detectar mejor la ocurrencia de mi patrón, donde necesito cambiar y escalar invariablemente como puede ver, y También podrá obtener resultados decentes para los escenarios realistas. (La buena noticia es que NO necesito que sea rotatoriamente invariable). La única idea que he podido llegar hasta ahora es una correlación 2D.
Debo agregar que, en realidad, NO tengo imágenes en color, solo obtendré una mezcla de números, así que supongo que estamos hablando de 'escala de grises'.
¡Gracias por adelantado!
PD: Para lo que vale, probablemente usaré C V abierto.
EDITAR # 1:
Según los comentarios, he agregado los detalles que solicitó aquí:
Para las características que definen los datos, podemos suponer lo siguiente:
La longitud horizontal de cada ping puede variar, pero conozco sus límites superior e inferior. SÍ para cualquier cosa dentro de este límite, NO para nada fuera. (Por ejemplo, sé que la longitud de los pings puede ser entre 1 y 3 segundos, por ejemplo).
Todos los pings deben estar 'visibles' para SÍ, sin embargo, puede faltar la última fila y aún así quiere decir 'SÍ'. De otra manera no.
La longitud vertical (el 'grosor') de cada ping puede variar, pero nuevamente, también conocemos el límite superior e inferior. (Similar a lo que ves en esas imágenes). SÍ para cualquier cosa dentro de ese límite. NO para nada afuera.
La altura entre cada ping siempre debe ser la misma para SÍ. Si no lo son, entonces NO. (Ejemplo, puede ver cómo todos los pings son de la misma altura entre sí, ~ 110 en el eje vertical). Entonces, 110 +/- 5 puede ser un SÍ, cualquier otra cosa tiene que ser NO.
Creo que eso es todo, pero hágame saber qué más puedo agregar ... (Además, todo lo que se muestra aquí debe registrarse como SÍ, por cierto).
detect this pattern shown here
? ¿Está interesado en aislar la línea roja / amarilla o realmente desea una expresión que calcule la relación entre dichas líneas? Solo encontrar líneas solo podría requerir cierto umbral o segmentación. ¿Qué quieres realmente?Respuestas:
En términos generales, hay dos enfoques principales para resolver este problema:
a. coincidencia de plantilla o
b. coincidir con un modelo parametrizado.
Personalmente, dada la simplicidad del modelo, preferiría el segundo enfoque para este problema.
Paso 1: identifica los blobs de ping
Como primer paso, extraiga las "Cajas", esencialmente los cuadrados amarillo / azul. Un método más simple aquí podría ser limitar la imagen. No parece haber muchas variaciones en el fondo, excepto que a medida que aumenta el ruido, tiende a ser bastante similar a los pings. Por lo tanto, el umbral puede ser global en toda la imagen, y creo que podrá obtener un umbral decente que funcione en todas las imágenes. Sin embargo, el umbral debe ser inteligente para que pueda usar algo como el método de Otsu. Vea esto y esto para más referencia.
Mejora de los bloques.
Una de las cosas buenas que puede hacer para eliminar puntos espurios que se parece a un primer plano de ping donde algunos píxeles dentro de los pings también son azules. Necesita aquí una operación morfológica llamada "Apertura". Aquí está una de las referencias de HIPR . Este tipo de operaciones requiere una forma inteligente que ayuda a preservar formas similares y eliminar otras. En su caso, puede elegir líneas horizontales. Al final de esto, tiene píxeles de fondo y primer plano que separan perfectamente los pings sin tocarse entre sí.
Paso 2: marcar / registrar bloques
Ahora que tiene los blobs más limpios posibles, es hora de marcarlos como 1,2,3,4 o A, B, C, D, etc. Esto generalmente se logra mediante lo que se llama un algoritmo simple. Ejecute cada píxel y, si está tocando con alguna región marcada, y también está en primer plano, asígnelo a ese segmento; de lo contrario, cree uno nuevo. Si encuentra más de 4 segmentos importantes, debe elegir los más relevantes. Aplique algo de heurística aquí en lugar de cualquier algoritmo teórico.
Paso 3: modelado de parámetros
Ahora, una vez que tengamos los 4 candidatos principales más probables de los 4 pings correspondientes, puede identificar los cuadros delimitadores, esencialmente las esquinas superior izquierda e inferior derecha (o la mayoría de los píxeles izquierdo y derecho, así como las filas superior e inferior del blob) . Encuentre el cuadro delimitador, puede multar el centroide de cada cuadro de ping.
por lo tanto, las distancias entre centroides ahora se pueden calcular:
Esencialmente tienes 8 parámetros de vecoter:
Paso 4: Clasificación
En el último paso, ahora necesitamos tener clasificación si hay un patrón de ping sí o no.
Para algo como esto, puede tener un buen marco clasificador bayesiano.
Hay dos hipótesis que tienes
Primero, estudie muchas imágenes donde sepa que pertenecen a la imagen. Ahora, puede trazar varios histogramas o aplicar algún método de estimación de densidad. Lea la clasificación de patrones por Duda Hart.
Ahora, de los datos de prueba
Por lo tanto, puedes calcular
Debe combinar esta expresión para la expresión vectorial y debe realizar un gran esfuerzo para poner exactamente la estimación del parámetro a realizar. Pero te dejo con un enfoque básico aquí.
Haga sus propios cálculos, esto será largo, pero aún debe ser bastante intuitivo.
EDITAR
Dado que ya está definiendo los criterios específicos de 110 +/- 5 píxeles, el último paso puede ser más simple. Probablemente no necesite calcular todas estas probabilidades si su criterio de clasificación es fijo.
fuente
Este problema me parece el problema de detección del intervalo de repetición de pulso + estimación. Necesitaré desarrollar esta respuesta con el tiempo, pero el tipo de algoritmos que funcionan bien en ese problema son la máxima probabilidad en una red .
fuente