Programación de memoria en FPGA

Estoy tratando de diseñar un sistema de procesamiento de imágenes en un FPGA para hacer Canny Edge Detection. El diseño se muestra en la siguiente imagen.

Detector de borde astuto

Tengo un ram de bloque grande para almacenar mi imagen. luego tengo búferes de línea más pequeños para leer solo las líneas que estoy procesando. Tengo 3 líneas en uso a la vez (con 1 otra línea como precarga para la siguiente fila de procesamiento).

El desafío que tengo es que el filtro 1 mira un cuadro de 9 píxeles y genera un valor para el píxel central. por lo tanto, para una imagen de 10x10, el filtro solo genera datos de 8x8 píxeles en el medio.

Una vez que el filtro 1 haya terminado 3 filas, quiero que el filtro 2 comience con los valores de píxel modificados. Para canalizar este diseño, tengo dificultades para descubrir cómo lidiar con los píxeles 'faltantes' que el filtro 1 no genera. ¿Cuál sería la mejor manera de cargarlos para el Filtro 2? ¿Debería tener una forma de omitir la primera + última fila y el primer y último píxel entre sí en mi búfer de segunda línea? o hay alguna otra manera puedo hacer esto?

Respuestas (1)

¿Por qué el primer filtro no genera todos los píxeles? Debería. Solo necesita averiguar qué necesita producir para los píxeles de "borde".

En mis diseños de procesamiento de video, tengo un módulo separado que llamo "generador de kernel" que se encuentra entre los búferes de línea y el filtro real. Lee los búferes de línea y emite los nueve píxeles de entrada (en paralelo) que deben operarse para cualquier píxel de salida en particular. En los bordes del marco, produce píxeles replicados para reemplazar los que estarían "fuera del borde" en el marco de entrada.

Lo que hace en los bordes depende en cierta medida de la aplicación, pero en la mayoría de los casos, funciona bien para "reflejar" los datos en el borde de la imagen. En otras palabras, cuando trabaja en la primera fila de la imagen, los datos de entrada que faltan (para la fila "cero") se completan con los datos de la segunda fila. La misma lógica se utiliza en los bordes izquierdo, derecho e inferior.

De esta forma, la salida de cualquier etapa de filtro tiene el mismo número de píxeles que su entrada y se minimizan los "efectos de borde".

También puede preparar su sistema para estas líneas de borde inútiles en la salida final. La ventaja de agregar píxeles replicados es que no necesita considerar líneas de borde incorrectas. La desventaja es agregar un módulo adicional y cierta complejidad al sistema.
¡Gracias por tu respuesta, Dave! Algunas preocupaciones con su sugerencia. 1. Sobrescribiré las filas que ya han pasado por el filtro. digamos que la fila 3 ya está copiada. luego, cuando el filtro está funcionando en la fila 4 (también está usando las filas 3 y 5), ¿no sobrescribirá los valores en la fila 3, que ya han pasado por el filtro? 2. Quiero tratar de evitar copiar o alterar el procesamiento en los bordes. Se supone que el algoritmo genera los píxeles de "borde" tal como están, por lo que no quiero que mi implementación haga otra cosa.
Yo no te entiendo. En su diagrama, asumo que el filtro 1 lee de los búferes de línea de la izquierda y escribe en los búferes de línea de la derecha, y luego el filtro 2 lee de los búferes de línea de la derecha, y así sucesivamente. Nada se sobrescribe. Si ese no es el caso, debe hacer que su diagrama/descripción sea más explícito sobre los detalles. Y no hay nada de malo en configurar el filtro para que pase los píxeles del borde sin modificar; aún tendrá la condición de que cada filtro emita tantos píxeles como reciba, lo que simplifica la administración del búfer.