¿Cómo reconstruyo el texto de una imagen usando solo operaciones morfológicas?


16

Quiero reconstruir el texto de la siguiente imagen lo mejor posible. La parte difícil es que quiero hacerlo solo usando operaciones morfógicas en la imagen

Intenté usar erosión, dilatación, apertura y cierre, pero el resultado no es muy bueno.

¿Es esto posible?

ingrese la descripción de la imagen aquí


¿La dilatación parece el primer paso obvio para suavizar esos bordes borrosos?
Paul R

Sí, creo que este es el primer paso de cada combinación que probé.

2
Creo que necesitas definir más tu problema. Por ejemplo, si te refieres a cómo puedes hacerlo más legible, entonces un poco de dilatación probablemente sea suficiente. Si desea reconstruir exactamente cómo se veía antes de cualquier proceso de distorsión, entonces eso no es posible, porque su algoritmo morfológico no tiene conocimiento de las formas de la fuente particular utilizada.
so12311

Para hacerlo más legible hice un imdilate con [0 1 0; 1 1 1; 0 1 0]. Estoy buscando algo que haga que el texto se vea muy cerca del original.
Jackobsen

Respuestas:


6

Si está dispuesto a sumar / restar imágenes transformadas morfológicamente, etc., puede contar cuántos píxeles de señal hay cerca de cada píxel y el umbral en función de ese número.

img = imread('http://i.stack.imgur.com/wicpc.png');

n = false(3);n(4) = 1;
s = false(3);s(6) = 1;
w = false(3);w(2) = 1;
e = false(3);e(8) = 1;

%# note that you could convolve with a cross instead
fourNeighbourCount = imerode(img,n) + imerode(img,s) + imerode(img,w) + imerode(img,3) + img;

ingrese la descripción de la imagen aquí

%# require at least two neighbours
img = fourNeighbourCount > 1;

ingrese la descripción de la imagen aquí

Si luego te involucras con una máscara 3x3 que tiene un agujero en el medio, puedes obtener algo como esto:

ingrese la descripción de la imagen aquí


3

¡Este es un problema bastante interesante de resolver! Prueba con un filtro mediano . Vea la referencia aquí y aquí para más detalles.

Aunque no he puesto mis manos para simular su problema, esta es una sugerencia. Mi instinto dice que podría darte un gran beneficio porque, se sabe que contrarresta el tipo de ruido sal y pimienta. En su caso, las imágenes tienen puntos blancos adicionales alrededor del borde que se convertirán a blanco o negro, dependiendo de qué lado del alfabeto esté. Así es como se ve después del filtrado medio:

ingrese la descripción de la imagen aquí


1

Si por alguna razón está limitado a usar operaciones morfológicas, entonces puede considerar usar un "esquema de votación" de operaciones cercanas orientadas.

Un problema con las operaciones morfológicas es que realmente no tienen en cuenta la direccionalidad. Para el píxel central, un vecindario como este

1 0 0
1 1 0
0 1 1

realmente no es diferente a un vecindario como este

0 1 0
1 1 0
1 1 0

Eso puede causar problemas, ya que la dilatación y la erosión no están sesgadas direccionalmente cuando usted quisiera que lo fueran. Entonces, una cosa que puede hacer es encontrar la operación morfológica sesgada direccionalmente más apropiada usando núcleos como estos:

1 1 0   1 0 0   1 0 0
0 1 0   1 1 0   1 1 0
0 1 1   0 1 1   0 1 1 . . .

Esto sería mejor con núcleos de 5 x 5, pero creo que la idea es lo suficientemente clara. Básicamente, la idea de un núcleo de detección de esquinas se estira un poco para que sea un núcleo de detección de segmento de línea. También puede usarlo para encontrar las curvas de mejor ajuste:

0 0 0 1 1
0 0 1 1 0
0 1 1 0 0 
0 0 1 1 0
0 0 0 1 1

Obviamente, esto conduce a una gran cantidad de núcleos, pero si la idea básica funciona prometedora, hay una manera de optimizar la técnica para que el núcleo que mejor se encuentre en una sola pasada.

En cualquier caso, si usa múltiples núcleos y algo de lógica, cada operación en (x, y) requiere más cálculos que un paso morfológico tradicional:

  1. En cada píxel (x, y), aplique cada uno de varios operadores morfológicos. Para cada operador, calcule tanto el resultado de la operación morfológica Y el grado en que la entrada coincide con el núcleo. ("Grado" = número de píxeles que coinciden)
  2. Elija el resultado morfológico para el núcleo que más se aproxime a la configuración real de píxeles de encendido / apagado.

El tamaño del núcleo debe coincidir con el tamaño de la entrada. En lugar de usar un kernel más grande, podría usar un kernel "extendido" para reducir la cantidad de operaciones. El siguiente núcleo es solo un núcleo de 3 x 3 con un radio mayor que 1.

1 0 0 0 0 0 0
0 0 0 0 0 0 0
1 0 0 1 0 0 0
0 0 0 0 0 0 0
1 0 0 0 0 0 1
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.