Comment reconstruire du texte à partir d'une image en utilisant uniquement des opérations morphologiques?


16

Je souhaite reconstruire au mieux le texte à partir de l'image suivante. La partie délicate est que je veux le faire uniquement en utilisant des opérations morphorogiques sur l'image

J'ai essayé d'utiliser l'érosion, la dilatation, l'ouverture et la fermeture mais le résultat n'est pas très bon.

Est-ce seulement possible?

entrez la description de l'image ici


La dilatation ressemble à la première étape évidente pour lisser ces bords flous?
Paul R

Oui, je pense que c'est la première étape de chaque combinaison que j'ai essayée.

2
Je pense que vous devez définir davantage votre problème. Par exemple, si vous voulez dire comment le rendre plus lisible, alors une petite dilatation est probablement suffisante. Si vous souhaitez reconstruire exactement à quoi il ressemblait avant quel que soit le processus de distorsion, cela n'est pas possible, car votre algorithme morphologique n'a aucune connaissance des formes de la police particulière utilisée.
so12311

Pour le rendre plus lisible, j'ai fait un imdilat avec [0 1 0; 1 1 1; 0 1 0]. Je cherche quelque chose qui rendra le texte très proche de l'original.
Jackobsen

Réponses:


6

Si vous êtes prêt à ajouter / soustraire des images transformées morphologiquement, etc., vous pouvez compter le nombre de pixels de signal à proximité de chaque pixel et le seuil basé sur ce nombre.

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;

entrez la description de l'image ici

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

entrez la description de l'image ici

Si vous convoluez ensuite avec un masque 3x3 qui a un trou au milieu, vous pouvez obtenir quelque chose comme ceci:

entrez la description de l'image ici


3

C'est un problème assez intéressant à résoudre! Essayez un filtre médian . Voir la référence ici et ici pour plus de détails.

Bien que je n'aie pas mis la main pour simuler votre problème, ceci est une suggestion. Mon intuition dit que cela pourrait vous apporter de grands avantages, car il est connu pour contrer le bruit de type sel et poivre. Dans votre cas, les images ont des points blancs supplémentaires autour de la bordure qui seront convertis en blanc ou en noir complet selon le côté de l'alphabet. Voici à quoi il ressemble après le filtrage médian:

entrez la description de l'image ici


1

Si, pour une raison quelconque, vous êtes limité à l'utilisation d'opérations morphologiques, vous pouvez envisager d'utiliser un «schéma de vote» d'opérations de fermeture orientées.

Un problème avec les opérations morphologiques est qu'elles ne prennent pas vraiment en compte la directionnalité. Pour le pixel central, un quartier comme celui-ci

1 0 0
1 1 0
0 1 1

n'est vraiment pas différent d'un quartier comme celui-ci

0 1 0
1 1 0
1 1 0

Cela peut causer des problèmes, car la dilatation et l'érosion ne sont pas biaisées lorsque vous les aimeriez. Donc, une chose que vous pouvez faire est de trouver l'opération morphologique à biais directionnel la plus appropriée en utilisant des noyaux quelque chose comme ceux-ci:

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

Ce serait mieux avec 5 x 5 noyaux, mais je pense que l'idée est assez claire. Fondamentalement, l'idée d'un noyau de détection de coin est un peu extensible de sorte qu'il s'agit d'un noyau de détection de segment de ligne. Vous pouvez également l'utiliser pour trouver les courbes les plus adaptées:

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

Évidemment, cela conduit à un grand nombre de noyaux, mais si l'idée de base fonctionne, cela vous promet qu'il existe un moyen d'optimiser la technique afin que le noyau le mieux adapté se trouve en une seule passe.

Dans tous les cas, si vous utilisez plusieurs noyaux et une certaine logique, chaque opération en (x, y) nécessite plus de calculs qu'une étape morphologique traditionnelle:

  1. À chaque pixel (x, y), appliquez chacun de plusieurs opérateurs morphologiques. Pour chaque opérateur, calculez à la fois le résultat de l'opération morphologique ET le degré auquel l'entrée correspond au noyau. ("Degré" = nombre de pixels qui correspondent)
  2. Choisissez le résultat morphologique pour le noyau qui correspond le mieux à la configuration réelle des pixels marche / arrêt.

La taille du noyau doit correspondre à la taille de l'entrée. Plutôt que d'utiliser un noyau plus gros, vous pouvez utiliser un noyau "étalé" pour réduire le nombre d'opérations. Le noyau suivant est juste un noyau 3 x 3 avec un rayon supérieur à 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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.