Come ricostruire il testo da un'immagine usando solo operazioni morfologiche?


16

Voglio ricostruire il testo della seguente immagine nel miglior modo possibile. La parte difficile è che voglio farlo solo usando operazioni morfologiche sull'immagine

Ho provato a usare l'erosione, la dilatazione, l'apertura e la chiusura ma il risultato non è molto buono.

È possibile?

inserisci qui la descrizione dell'immagine


La dilatazione sembra l'ovvio primo passo per appianare quei bordi sfocati?
Paolo R

Sì, penso che questo sia il primo passo di ogni combinazione che ho provato.

2
Penso che tu debba definire di più il tuo problema. Ad esempio, se intendi come renderlo più leggibile, probabilmente è sufficiente una piccola dilatazione. Se vuoi ricostruire esattamente come appariva prima di qualsiasi processo di distorsione, allora questo non è possibile, perché il tuo algoritmo morfologico non ha conoscenza delle forme del particolare carattere utilizzato.
so12311,

Per renderlo più leggibile ho creato un imdilato con [0 1 0; 1 1 1; 0 1 0]. Sto cercando qualcosa che renda il testo molto vicino a quello originale.
Jackobsen,

Risposte:


6

Se sei disposto ad aggiungere / sottrarre immagini trasformate morfologicamente, ecc., Puoi contare il numero di pixel del segnale nelle vicinanze di ciascun pixel e la soglia in base a quel numero.

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;

inserisci qui la descrizione dell'immagine

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

inserisci qui la descrizione dell'immagine

Se poi ti avvolgi con una maschera 3x3 che ha un buco nel mezzo, puoi ottenere qualcosa del genere:

inserisci qui la descrizione dell'immagine


3

Questo è un problema piuttosto interessante da risolvere! Prova un filtro mediano . Vedi il riferimento qui e qui per maggiori dettagli.

Anche se non ho messo le mani per simulare il tuo problema, questo è un suggerimento. Il mio istinto dice che potrebbe darti grandi benefici perché, è noto per contrastare il tipo di rumore salato e pepato. Nel tuo caso, le immagini hanno punti bianchi extra attorno al bordo che verranno convertiti in bianco pieno o nero pieno a seconda del lato dell'alfabeto. Ecco come si occupa del filtro mediano:

inserisci qui la descrizione dell'immagine


1

Se per qualche motivo sei limitato all'utilizzo di operazioni morfologiche, puoi prendere in considerazione l'uso di uno "schema di voto" di operazioni orientate ravvicinate.

Un problema con le operazioni morfologiche è che non tengono davvero conto della direzionalità. Per il pixel centrale, un quartiere come questo

1 0 0
1 1 0
0 1 1

non è davvero diverso da un quartiere come questo

0 1 0
1 1 0
1 1 0

Ciò può causare problemi poiché la dilatazione e l'erosione non sono orientate direzionalmente quando si potrebbe desiderare che lo siano. Quindi una cosa che puoi fare è trovare l'operazione morfologica orientata direzionalmente più appropriata usando i kernel qualcosa del genere:

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

Questo sarebbe meglio con 5 x 5 kernel, ma penso che l'idea sia abbastanza chiara. Fondamentalmente, l'idea di un kernel di rilevamento degli angoli è leggermente allungata in modo che sia un kernel di rilevamento del segmento di linea. Puoi anche usarlo per trovare le curve più adatte:

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

Ovviamente questo porta a un numero enorme di kernel, ma se l'idea di base funziona promettendo che c'è un modo per ottimizzare la tecnica in modo che il kernel più adatto si trovi in ​​un unico passaggio.

In ogni caso, se usi più kernel e qualche logica, ogni operazione in (x, y) richiede più calcoli di un tradizionale passo morfologico:

  1. Ad ogni pixel (x, y), applicare ciascuno dei diversi operatori morfologici. Per ciascun operatore, calcolare sia il risultato dell'operazione morfologica sia il grado in cui l'input corrisponde al kernel. ("Grado" = numero di pixel corrispondenti)
  2. Scegli il risultato morfologico per il kernel che si avvicina maggiormente alla configurazione effettiva dei pixel on / off.

La dimensione del kernel deve corrispondere alla dimensione dell'input. Invece di utilizzare un kernel più grande, è possibile utilizzare un kernel "spread" per ridurre il numero di operazioni. Il kernel seguente è solo un kernel 3 x 3 con un raggio maggiore di 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.