Tengo alrededor de 1.400 archivos JPEG que se han dañado de alguna manera y han perdido las imágenes de copia de seguridad. Todos parecen tener el mismo patrón de líneas cuadriculadas sobre cada una (es decir, la cuadrícula no cambia de una imagen a otra.
Así es como se ve una de estas imágenes:
¿Existen técnicas de filtrado de imágenes en Matlab en particular o de otra manera que eliminen o suavicen este patrón de cuadrícula?
Respuestas:
Puede usar un algoritmo de pintura estándar. Estos algoritmos reemplazan los píxeles marcados en una imagen con los valores de píxeles que rodean estos píxeles marcados. El desafío aquí es detectar la cuadrícula (mis pruebas parecen mostrar que no es una cuadrícula completamente regular). Entonces, se me ocurrió esta solución:
La salida del programa es la siguiente:
Para detectar la red hice una solución rápida y sucia. Se puede mejorar mucho, pero muestra la idea inicial. El flujo general es:
Para la pintura, utilicé la operación de pintura OpenCV . Para detectar la cuadrícula, realicé la detección de bordes en dirección X e Y utilizando un filtro Sobel. Luego agrego todos los valores de borde en la dirección X e Y para encontrar picos, donde están las líneas de la cuadrícula. Luego, elijo los picos más altos como las coordenadas donde se estiman las líneas de la cuadrícula. No funciona perfectamente (por ejemplo, los bordes fuertes de la imagen se detectan falsamente como líneas de cuadrícula), pero muestra la idea. Se puede mejorar, por ejemplo, con la transformación de Hough para encontrar líneas, patear bordes muy fuertes, etc.
Alternativamente, si la cuadrícula es realmente la misma para todas las imágenes, entonces puede realizar la detección de la cuadrícula conjuntamente para todas las imágenes, lo que produciría una precisión mucho mejor (solo realice la técnica anterior, pero antes de elegir los picos, resuma los resultados de todas las imágenes). Con más detalle, calcularía eX para todas las imágenes y agregaría todas estas eX juntas en un solo vector. Este vector tendrá una estructura de pico mucho más clara y el umbral puede hacerse más fácilmente.
fuente
Probé un algoritmo realmente simple de ejecutar un filtro mediano de 3x3 en los canales R y G de esa imagen y funciona bastante bien. El código de Python es realmente simple:
Alternativamente, puede usar el filtrado de dominio de frecuencia como se describe en esta pregunta: /programming/34027840/removing-periodic-noise-from-an-image-using-the-fourier-transform
La transformación de Fourier de su imagen muestra claramente algunos "puntos" repetidos en el espectro correspondiente a este ruido periódico.
Como señaló Maximilian, este último método funciona bien solo si el ruido es perfectamente periódico, lo que no parece ser el caso aquí.
Intenté ejecutar un filtro realmente estúpido que pone a cero 5x5 cuadrados de intervalos de frecuencia centrados alrededor de múltiplos de 9 en ambas direcciones xey, y (más o menos) suprime el ruido pero introduce artefactos en ubicaciones que no contienen ruido (por ejemplo, el cielo).
Quizás se pueda hacer mejor con un diseño cuidadoso de filtro de muesca en lugar de poner a cero directamente los contenedores FFT (¡ nunca lo haga en la práctica! ) Y solo aplicar el filtro en las regiones de la imagen donde está presente el ruido (es decir, no filtrar el cielo).
fuente