Sé que esta pregunta puede no ser muy relevante para la programación, pero si no entiendo la teoría detrás del procesamiento de imágenes, nunca podré implementar algo en la práctica.
Si lo entendí bien, los filtros gaussianos están enredados con una imagen para la reducción de ruido, ya que calculan un promedio pesado de la vecindad de un píxel y son muy útiles en la detección de bordes, ya que puede aplicar un desenfoque y derivar la imagen al mismo tiempo simplemente convolucionado con la derivada de una función gaussiana.
Pero, ¿alguien puede explicarme o darme algunas referencias sobre cómo se calculan?
Por ejemplo, el detector de bordes de Canny habla de un filtro gaussiano 5x5, pero ¿cómo obtuvieron esos números en particular? ¿Y cómo pasaron de una convolución continua a una multiplicación de Matrix?
Respuestas:
Para que esta operación funcione, debe imaginar que su imagen se reforma como un vector. Luego, este vector se multiplica a su izquierda por la matriz de convolución para obtener la imagen borrosa. Tenga en cuenta que el resultado también es un vector del mismo tamaño que la entrada, es decir, una imagen del mismo tamaño.
Cada fila de la matriz de convolución corresponde a un píxel en la imagen de entrada. Contiene el peso de las contribuciones de todos los demás píxeles de la imagen a la contraparte borrosa del píxel considerado.
Tomemos un ejemplo: desenfoque de cuadro de tamaño píxeles en una imagen de tamaño píxeles. La imagen reformada es una columna de 36 electos, mientras que la matriz de desenfoque tiene un tamaño de .3 × 3 6 × 6 36 × 36
Puede encontrar una ilustración visual de un proceso estrechamente relacionado (convolución + sustracción) en esta publicación de blog (de mi blog personal).
fuente
Para aplicaciones a imágenes o redes de convolución, para usar de manera más eficiente los multiplicadores de matriz en las GPU modernas, las entradas generalmente se reforman en columnas de una matriz de activación que luego se puede multiplicar con múltiples filtros / núcleos a la vez.
Consulte este enlace del CS231n de Stanford y desplácese hacia abajo hasta la sección "Implementación como multiplicación matricial" para obtener más detalles.
El proceso funciona tomando todos los parches locales en una imagen de entrada o mapa de activación, los que se multiplicarían con el núcleo, y extendiéndolos en una columna de una nueva matriz X a través de una operación comúnmente llamada im2col. Los núcleos también se estiran para llenar las filas de una matriz de peso W de modo que cuando se realiza la operación de matriz W * X, la matriz resultante Y tiene todos los resultados de la convolución. Finalmente, la matriz Y debe ser reformada nuevamente convirtiendo las columnas nuevamente en imágenes mediante una operación típicamente llamada cal2im.
fuente
La convolución en el dominio del tiempo es igual a la multiplicación de matrices en el dominio de la frecuencia y viceversa.
El filtrado es equivalente a la convolución en el dominio del tiempo y, por lo tanto, a la multiplicación de matrices en el dominio de la frecuencia.
En cuanto a los mapas o máscaras de 5x5, provienen de la discretización de los operadores canny / sobel.
fuente
Escribí una función que resuelve esto en mi StackOverflow Q2080835 GitHub Repository (Eche un vistazo
CreateImageConvMtx()
).En realidad, la función puede admitir cualquier forma de convolución que desee -
full
,same
yvalid
.El código es el siguiente:
También creé una función para crear una matriz para el filtrado de imágenes (ideas similares a las de MATLAB
imfilter()
):El código fue validado contra MATLAB
imfilter()
.El código completo está disponible en mi repositorio GitHub de StackOverflow Q2080835 .
fuente