Détection du nombre de fils dans l'image du tissu

12

Je suis un utilisateur novice dans le traitement d'image et je travaille sur un projet pour déterminer le nombre de fils dans une image de tissu, c'est-à-dire les chaînes et les trames (fils perpendiculaires et parallèles à l'axe des x).

exemple d'image

J'essaie de détecter les fils en prenant la somme des colonnes et des rangées pour les chaînes et les trames respectivement, mais cela ne semble pas fonctionner parce que l'image n'est pas très bien focalisée et nette. La méthode est également très sensible à l'alignement des fils dans le tissu.

Veuillez proposer un meilleur algorithme si possible pour la détection des fils. Aussi s'il y a une possibilité de rendre les fils droits pour chaque image capturée. J'ai essayé IMROTATE mais cela crée des régions noires dans l'image qui perturbent la somme des lignes et l'algorithme échoue.

Toute aide à cet égard me sera très utile. Merci.


la source
Utilisez une FFT. Est-ce des devoirs?
endolith
Oui, une transformée de Fourier est probablement le bon point de départ. Cela "tirerait" la régularité de l'image du flou. Je ne sais pas comment gérer la rotation partielle. Vous pourriez peut-être transformer les bandes et noter leur phase, puis déterminer si les bandes adjacentes étaient de biais à gauche ou à droite.
Daniel R Hicks

Réponses:

9

Une transformée de Fourier vous donnera la période de toutes les caractéristiques périodiques de l'image - par exemple, elle vous dira qu'il y a un événement de structure 3 pixels horizontalement et 5 pixels verticalement, à partir de cela et de l'échelle de pixels, vous pouvez calculer le nombre de fils

Martin Beckett
la source
3

Du code dans Mathematica:

i = ColorNegate@Import@"http://i.stack.imgur.com/Jlhgw.jpg";
i3 = DeleteSmallComponents[Binarize[i, .4], 10];
lines = ImageLines[i3, .6];
Show[i, Graphics[{Thick, Orange, Line /@ lines}]]
(*y coord mean increments at x=0 *)
b = Mean@Differences@ Sort[(#[[2, 1]] #[[1, 2]] - #[[1, 1]] #[[2, 2]])/(#[[1,1]] - #[[2, 1]]) & /@ lines];
(*mean slope*)
a = Mean[-(-#[[1, 2]] + #[[2, 2]])/(#[[1, 1]] - #[[2, 1]]) & /@ lines];
(*Threads*)
- a ImageDimensions[i3][[1]]/b 
(*yarns*)
2 ImageDimensions[i3][[2]]/b

Résultat>

entrez la description de l'image ici

34,5541
27,2259

Dr. belisarius
la source
1
Ce serait bien si vous expliquez ce que vous faites dans ce code.
Abid Rahman K