Le Traitement de l'Image Détection de Bord en Java
C'est ma situation. Elle implique l'alignement d'une image numérisée qui compte d'une erreur de numérisation. Je dois aligner l'image numérisée avec mon programme Java.
Ces sommes plus de détails:
- Il y a une table en forme imprimé sur une feuille de papier, ce qui sera numérisée dans un fichier image.
- Je vais ouvrir l'image avec Java, et je vais avoir une SUPERPOSITION de zones de texte.
- Les zones de texte sont censés s'aligner correctement avec l'image numérisée.
- Afin d'aligner correctement, mon programme Java doit analyser l'image numérisée et de détecter les coordonnées des bords de la table sur l'image numérisée, et donc la position de l'image et les zones de texte de sorte que les zones de texte et de l'image à la fois d'aligner correctement (en cas de mauvaise numérisation)
Vous voyez, les gars de la numérisation de l'image peut ne pas nécessairement placer l'image dans une parfaite position correcte, donc j'ai besoin de mon programme d'aligner automatiquement les images numérisées comme il le charge. Ce programme pourra être réutilisé sur plusieurs de ces images numérisées, j'ai donc besoin que le programme flexible de cette façon.
Ma question est l'une des opérations suivantes:
- Comment puis-je utiliser Java pour détecter la coordonnée y du bord supérieur de la table et de la coordonnée x de la plus à gauche du bord de la table. La table est une table régulière avec de nombreuses cellules, avec une fine bordure noire, imprimé sur une feuille de papier blanc (horizontal, impression)
- Si une méthode plus simple existe pour aligner automatiquement les images numérisées de telle manière que toutes les images numérisées aura le graphique de la table aligner sur les mêmes coordonnées x, y, alors partagez cette méthode :).
- Si vous ne connaissez pas la réponse à ces questions, dites-moi où je dois commencer. Je ne sais pas beaucoup sur le graphisme de programmation java et j'ai environ 1 mois pour terminer ce programme. Il suffit de supposer que j'ai un emploi du temps serré et je dois faire la partie graphique aussi simple que possible pour moi.
Acclamations et je vous remercie.
OriginalL'auteur ThePrince | 2013-09-17
Vous devez vous connecter pour publier un commentaire.
Essayez de démarrer à partir d'un scénario simple et d'améliorer l'approche.
Le programme présenté à la fin de ce post ne fait les étapes 1 à 3. Il a été mis en œuvre à l'aide de Marvin Cadre. L'image ci-dessous montre l'image de sortie avec la détection des coins.
Le programme des sorties: angle de Rotation:1.6365770416167182
Code Source:
imgur.com/G5pKIRx
Il y a beaucoup d'autres éléments (et d'autres coins) dans l'image. Je vois deux options: (1) isoler du tableau, (2) utiliser un autre au lieu de l'angle de détection. Peut-être vous pouvez utiliser la ligne de détection, à la recherche de lignes est plus qu'une valeur spécifique. Cette erreur se produit parce que le programme est en train d'essayer de remplir un rectangle dans les limites de l'image. En d'autres termes, c'est d'essayer de dessiner les pixels en dehors de l'image. Vérifier le Point de coordonner et d'envisager une marge avant d'invoquer ret.fillRect().
OriginalL'auteur Gabriel Ambrósio Archanjo
La détection de contours est quelque chose qui est généralement fait en améliorant le contraste entre les pixels voisins, de sorte que vous obtenez facilement détectable ligne, qui est approprié pour un traitement ultérieur.
Pour ce faire, un "noyau" transforme un pixel selon le pixel initial de la valeur et de la valeur de ce pixel voisins. Une bonne détection des bords du noyau permettra d'améliorer les différences entre les pixels voisins, et de réduire l'intensité d'un pixel avec les mêmes neigbors.
Je voudrais commencer par regarder l'opérateur de Sobel. Cela pourrait ne pas retourner des résultats qui sont immédiatement utiles; cependant, il obtiendra beaucoup plus proche que vous le feriez si vous étiez à l'approche du problème avec peu de connaissances dans le domaine.
Après vous avez quelques croustillant nettoyer les bords, vous pouvez utiliser les plus gros grains de détecter les points où il semble que 90% de la plier en deux lignes se produit, qui peut vous donner les coordonnées en pixels du rectangle extérieur, ce qui peut être suffisant pour vos besoins.
Avec celles extérieur coordonnées, c'est toujours un peu de maths pour faire de la nouvelle pixels être compostés avec les valeurs moyennes entre l'ancien pixels rotation et déplacé vers "match". Les résultats (surtout si vous ne savez pas à propos de l'anti-aliasing mathématiques) peut être assez mauvais, l'ajout de flou à l'image.
Filtres d'accentuation pourrait être une solution, mais ils viennent avec leurs propres problèmes, surtout qu'ils rendent l'image plus nette par l'ajout de grain. Trop, et il est évident que l'image d'origine n'est pas de haute qualité de numérisation.
OriginalL'auteur Edwin Buck
Similaire à ce problème, je l'ai fait dans le passé, essentiellement compris l'orientation de la forme, revu, re-mis à l'échelle, et j'ai été tous ensemble. Vous pouvez utiliser la transformation de Hough pour détecter l'angle de décalage de l'image (c'est à dire: combien il est mis en rotation), mais vous avez encore besoin de détecter les limites de la forme. Il fallait aussi tenir compte des limites de la feuille de papier lui-même.
C'était un coup de chance pour moi, parce que, essentiellement, il a montré une image en noir et blanc dans le milieu d'une grosse bordure noire.
4) Cela vous donne une base de vecteur. Il vous suffit de l'utiliser pour ré-orienter votre image à un standard de base de la matrice (c'est à dire: [1,0],[0,1]).
Votre image est maintenant aligné à merveille. Je l'ai fait pour normaliser l'orientation de l'IRM de l'ensemble du cerveau humain.
Vous savez aussi que vous avez un énorme bordure noire autour de l'image réelle. Il vous suffit de maintenir la suppression de lignes du haut et du bas, et les deux côtés de l'image jusqu'à ce qu'ils sont tous partis. Vous pouvez appliquer temporairement un 7x7 la médiane ou le mode de filtre à une copie de l'image jusqu'à présent à ce point. Il permet d'éliminer trop de frontière restant dans l'image finale à partir d'empreintes digitales, la saleté, etc.
OriginalL'auteur DevNull
J'ai recherché dans les bibliothèques, mais à la fin je l'ai trouvé plus commode de code de ma propre bord des méthodes de détection.
La classe ci-dessous permettra de détecter noir/grisé bords de numérisée feuille de papier qui contient ces bords, et sera de retour les coordonnées x et y des bords de la feuille de papier, à partir de l'extrême droite (reverse = true) ou à partir de l'extrémité inférieure (reverse = true) ou à partir du bord supérieur (reverse = false) ou à partir du bord gauche (reverse = false). Aussi...le programme prendra les plages le long des bords verticaux (plagex) mesurée en pixels, et horizontale des plages (rangey) mesurée en pixels. Les plages de déterminer les valeurs aberrantes dans les points reçus.
Le programme n'4 coupes verticales à l'aide des tableaux, et 4 coupes horizontales. Il récupère les valeurs des points sombres. Il utilise les gammes d'éliminer les valeurs aberrantes. Parfois, une petite tache sur le papier peut provoquer une valeur aberrante point. Le plus petit de la gamme, moins le nombre de valeurs aberrantes. Cependant, parfois, le bord est légèrement incliné, de sorte que vous ne souhaitez pas rendre la plage est trop petite.
Avoir du plaisir. Il fonctionne parfaitement pour moi.
OriginalL'auteur ThePrince