29 votos

Eliminar el patrón de textura del papel de una fotografía

He escaneado una foto antigua con patrón de textura de papel y me gustaría eliminar la textura lo máximo posible sin bajar la calidad de la imagen. ¿Hay alguna manera, probablemente utilizando la caja de herramientas de procesamiento de imágenes en MATLAB?

He intentado aplicar la transformación FFT (utilizando Plugin de Photoshop ), pero no pude encontrar ninguna mancha blanca clara para ser pintada. ¿Probablemente el patrón no es tan regular para este método?

Puede ver la muestra a continuación. Si necesitas la imagen completa puedo subirla a algún sitio. photograph sample

23voto

misha Puntos 10541

Desgraciadamente, no hay más remedio que utilizar el dominio espacial, ya que el patrón no es lo suficientemente repetitivo como para que el análisis de Fourier sea útil.

Como han señalado @Jonas y @michid, el filtrado te ayudará con un problema como éste. Con el filtrado, te enfrentas a un compromiso entre la cantidad de detalle que quieres mantener y la cantidad de ruido (o componentes de la imagen no deseados) que quieres eliminar. Por ejemplo, el filtro mediano utilizado por @Jonas elimina por completo la textura del papel (incluso el arañazo redondo cerca del borde inferior de la imagen), pero también elimina toda la textura de los ojos, el pelo, la cara y el fondo (aunque en realidad no nos importa tanto el fondo, sino el primer plano). También verás una ligera disminución del contraste de la imagen, que suele ser indeseable. Esto da a la imagen un aspecto artificial.

Así es como yo manejaría este problema:

  • Detecta el patrón de textura del papel:
    • Aplique el desenfoque gaussiano a la imagen (utilice un núcleo grande para asegurarse de que se destruye toda la información de la textura del papel
    • Calcular la diferencia de imagen entre las imágenes borrosas y las originales
    • EDITAR 2 Aplique el desenfoque gaussiano a la imagen de diferencia (utilice un núcleo pequeño de 3x3)
  • Umbral del patrón anterior utilizando un umbral determinado empíricamente. Así se obtiene una imagen binaria que puede utilizarse como máscara.
  • Utilizar el filtrado de la mediana (como menciona @Jonas) para sustituir sólo las partes de la imagen que corresponden al patrón de papel.

Patrón de textura del papel (antes de la umbralización):

enter image description here

Quieres que haya la menor cantidad de información real en la imagen anterior. Verás que puedes distinguir muy débilmente el borde de la cara (esto no es bueno, pero es lo mejor que tengo tiempo). También quieres que esta imagen de textura de papel sea lo más uniforme posible (para que el umbralizado dé resultados iguales en toda la imagen). De nuevo, la parte derecha de la imagen de arriba es ligeramente más oscura, lo que significa que umbralizarla bien será difícil.

Imagen final:

enter image description here

El resultado no es perfecto, pero ha eliminado por completo el patrón de textura del papel, muy visible, a la vez que conserva más contenido de alta frecuencia que los enfoques de filtrado más sencillos.

EDITAR

Las zonas rellenadas suelen ser de color liso y, por lo tanto, destacan un poco si se observa la imagen muy de cerca. También puede intentar añadir un poco de ruido gaussiano de baja intensidad y media cero a las zonas rellenas para que parezcan más realistas. Tendrías que elegir la varianza del ruido para que coincida con el fondo. Determinarla empíricamente puede ser suficiente.

Aquí está la imagen procesada con el ruido añadido:

enter image description here

Obsérvese que las partes en las que se ha eliminado el patrón de papel son más difíciles de ver porque el ruido gaussiano añadido las enmascara. He utilizado la misma distribución gaussiana para toda la imagen, pero si quieres ser más sofisticado puedes utilizar diferentes distribuciones para la cara, el fondo, etc.

13voto

Jonas Puntos 54073

Un filtro de mediana puede ayudarte un poco:

img = imread('http://i.stack.imgur.com/JzJMS.jpg');
%# convert rgb to grayscale
img = rgb2gray(img);
%# apply median filter
fimg = medfilt2(img,[15 15]);
%# show
imshow(fimg,[])

enter image description here

Tenga en cuenta que es posible que quiera acolchar la imagen primero para evitar los efectos de los bordes.

EDITAR : Un núcleo de filtro más pequeño que [15 15] conservará mejor la textura de la imagen, pero dejará más rastros visibles del filtrado.

3voto

vini Puntos 788

Bueno, he probado un enfoque diferente utilizando la difusión anisotrópica utilizando el segundo coeficiente que opera en áreas más amplias

Este es el resultado que obtuve:

enter image description here

1voto

michid Puntos 3526

Por lo que puedo ver en la imagen, el ruido tiene una frecuencia relativamente alta en comparación con la imagen misma. Así que la aplicación de un filtro de paso bajo debería funcionar. Echa un vistazo al espectro de potencia abs(fft(...)) para determinar la frecuencia de corte.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X