Como reconstruo o texto de uma imagem usando apenas operações morfológicas?

16

Quero reconstruir o texto da imagem a seguir da melhor maneira possível. A parte complicada é que eu quero fazê-lo usando apenas operações morfológicas na imagem

Tentei usar erosão, dilatação, abertura e fechamento, mas o resultado não é muito bom.

Isso é possível?

insira a descrição da imagem aqui

Jackobsen
fonte
A dilatação parece o primeiro passo óbvio para suavizar as bordas confusas?
Paul R
Sim, acho que este é o primeiro passo de todas as combinações que tentei.
2
Eu acho que você precisa definir mais o seu problema. Por exemplo, se você quer dizer como pode torná-lo mais legível, provavelmente uma pequena dilatação é suficiente. Se você deseja reconstruir exatamente como era antes de qualquer processo de distorção, isso não é possível, porque seu algoritmo morfológico não tem conhecimento das formas da fonte específica usada.
so12311
Para torná-lo mais legível, criei um imdilate com [0 1 0; 1 1 1; 0 1 0] Estou procurando por algo que faça o texto parecer muito próximo do original.
Jackobsen

Respostas:

6

Se você deseja adicionar / subtrair etc. imagens transformadas morfologicamente, pode contar quantos pixels de sinal estão nas proximidades de cada pixel e o limite com base nesse 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;

insira a descrição da imagem aqui

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

insira a descrição da imagem aqui

Se você convoluir com uma máscara 3x3 com um orifício no meio, poderá obter algo assim:

insira a descrição da imagem aqui

Jonas
fonte
3

Este é um problema bastante interessante para resolver! Tente um filtro mediano . Veja a referência aqui e aqui para mais detalhes.

Embora eu não tenha me esforçado para simular seu problema, esta é uma sugestão. Meu pressentimento diz que isso pode lhe proporcionar um grande benefício, pois é conhecido por combater o ruído do tipo sal-e-pimenta. No seu caso, as imagens possuem pontos brancos extras ao redor da borda, que serão convertidos em branco ou preto, dependendo do lado do alfabeto. Aqui está como ele cuida da filtragem mediana:

insira a descrição da imagem aqui

Dipan Mehta
fonte
1

Se, por algum motivo, você estiver limitado a usar operações morfológicas, considere usar um "esquema de votação" de operações orientadas a fechamento.

Um problema com operações morfológicas é que elas realmente não levam em consideração a direcionalidade. Para o pixel central, um bairro como este

1 0 0
1 1 0
0 1 1

realmente não é diferente de um bairro como este

0 1 0
1 1 0
1 1 0

Isso pode causar problemas, pois a dilatação e a erosão não são direcionadas direcionalmente, quando você gostaria que elas fossem. Então, uma coisa que você pode fazer é encontrar a operação morfológica com orientação direcional mais apropriada usando kernels, algo como:

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 . . .

Isso seria melhor com kernels 5 x 5, mas acho que a idéia é clara o suficiente. Basicamente, a idéia de um kernel de detecção de canto é um pouco extenso, de modo que é um kernel de detecção de segmento de linha. Você também pode usá-lo para encontrar as curvas mais adequadas:

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, isso leva a um grande número de kernels, mas se a idéia básica funcionar mostra promessa para você, há uma maneira de otimizar a técnica para que o kernel mais adequado seja encontrado em uma única passagem.

De qualquer forma, se você usar vários kernels e alguma lógica, cada operação em (x, y) exigirá mais cálculos do que uma etapa morfológica tradicional:

  1. Em cada pixel (x, y), aplique cada um dos vários operadores morfológicos. Para cada operador, calcule o resultado da operação morfológica E o grau em que a entrada corresponde ao kernel. ("Grau" = número de pixels correspondentes)
  2. Escolha o resultado morfológico para o kernel que mais se aproxima da configuração real de pixel ativado / desativado.

O tamanho do kernel deve corresponder ao tamanho da entrada. Em vez de usar um kernel maior, você pode usar um kernel "spread" para reduzir o número de operações. O kernel a seguir é apenas um kernel 3 x 3 com um raio maior 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
Rethunk
fonte