Extraire une zone prédéfinie dans une imageCher tout le monde,
Je veux savoir s'il est possible d'extraire avec un script les pixels situés dans le cercle prédéfini de mon image (voir ci-joint).
Merci d'avance pour votre aide.
Krs,
Samir
Re: extraire une zone prédéfinie dans une imagePeut être. Vous pourrez peut-être créer un modèle à l'aide de statistiques sur les valeurs de pixels dans l'image pour créer les deux valeurs de seuil requises par le filtre. Vous voudrez peut-être lisser l'image avant le filtre astucieux (pas à l'intérieur du filtre astucieux) afin de pouvoir construire le modèle avec les pixels lissés. (Edit: le filtre flou interne est meilleur car il garde une trace des données en virgule flottante. Un flou externe réduit les données en virgule flottante à un nombre entier de pixels de 0..255 dans l’image floue et la plupart de vos pixels dans l’image sombre sont égaux à 0..10 environ.)
https://en.wikipedia.org/wiki/Canny_edge_detector décrit le fonctionnement du filtre astucieux; la valeur de seuil élevée (très petite pour vos images) est le point de départ d'une ligne. Deux pixels adjacents doivent être tellement différents. La ligne est "suivie" jusqu'à ce qu'elle passe en dessous de la petite valeur de seuil (très, très petite pour vos images). "Les deux valeurs de seuil sont déterminées de manière empirique et leur définition dépendra du contenu d'une image d'entrée donnée." - Wikipedia
Les couleurs sont-elles importantes dans ces images? Sinon, vous pouvez réduire l’image en niveaux de gris. Cela deviendra un problème plus simple, je pense. Vous pouvez faire une distribution des valeurs de l'échelle de gris ...
Que ferez-vous avec la ligne après l'avoir obtenue dans une image? Est-ce juste une visualisation, ou ferez-vous plus de calculs sur cette image? L'approche de regroupement peut encore fonctionner si vous avez besoin d'un centre de masse et d'un rayon.
Re: extraire une zone prédéfinie dans une imageCher Craige,
nous avons déployé la solution de manière automatisée, mais nous devons encore adapter manuellement les paramètres de seuil car les photos sont hétérogènes. Pensez-vous qu'il est possible d'automatiser cette étape?
Merci beaucoup,
Samir
Re: extraire une zone prédéfinie dans une imageCher Craige,
Le filtre astucieux est vraiment utile.
Je vais essayer d'automatiser le processus.
Le regroupement est également très intéressant mais le résultat est moins clair pour certaines autres photos.
Merci beaucoup pour votre aide,
Samir
Re: extraire une zone prédéfinie dans une imageJetez un coup d'œil à l'exemple de filtre astucieux de l'index de script. Les paramètres sont sur des curseurs et peuvent être trop délicats si vos données varient en intensité, mais pour l'exemple d'image que j'ai utilisé
Paramètres du curseur dans l'exemple d'index de script
Pour obtenir ceci
Filtre Canny détecte les bords
Le bruit de l'image a été atténué, en grande partie, par les deux curseurs supérieurs. Les deux curseurs inférieurs ont été ajustés aux valeurs appropriées pour ces intensités de pixels. Le script est dans l'exemple; vous pourrez peut-être automatiser votre processus si les images sont suffisamment similaires. La sortie est une image en noir et blanc ou en uns et en zéros. Vous pouvez saisir ces pixels dans une matrice pour un traitement ultérieur.
Vous voudrez peut-être aussi analyser les couleurs des pixels. Peut-être que le regroupement vous donnerait une foncé bleu et plus sombre paire bleue de grappes. Vous pourriez peut-être utiliser les coordonnées xy des pixels en cluster bleu foncé. par exemple:
// load the test image
img = open("$desktop/large.png","png");
// grab the rgb data from the image
{r,g,b} = img<<GETPIXELS></GETPIXELS>
Résultats de regroupement transformés en une image
Il serait peut-être plus judicieux de travailler avec les coordonnées XY des pixels du cluster pour trouver les paramètres souhaités.
Re: extraire une zone prédéfinie dans une imageCher Craige,
Merci pour la suggestion.
Malheureusement, la localisation du cercle à l'intérieur de l'image peut se déplacer d'une photo à l'autre (non encore normalisée).
Ma question est de savoir s'il est possible de détecter les contours du cercle de manière automatique.
Krs,
Samir
Re: extraire une zone prédéfinie dans une imageOui. Obtenez une matrice des valeurs de pixel pour l'image entière, quelque chose comme
image << getpixels (consultez l'index de script, je suis loin de mon bureau en ce moment).
Vous pouvez obtenir les pixels en tant que canaux séparés r, g, b ou en tant que couleur JMP combinée.
Ensuite, vous aurez besoin d'une matrice de masque de mêmes dimensions, avec celles que les pixels doivent conserver et les zéros que les pixels doivent rejeter. Vous pouvez utiliser un programme de peinture avec blanc pour un et noir pour zéro. Chargez cette image et obtenez un seul canal, rouge peut-être (r, g, b devraient tous être identiques pour l'image en noir et blanc), qui auront les valeurs zéro et un.
Maintenant, décidez ce que vous voulez que le résultat soit: juste une liste non ordonnée de seulement les pixels intéressants? Ou une matrice de la même taille qu'avant avec les valeurs sans intérêt mises à zéro?
imageMatrix [Loc (masque)] vous donnera les pixels non ordonnés où le masque avait des valeurs non nulles.
imageMatrix: * mask vous donnera zéro lorsque le masque est égal à zéro, les valeurs d'origine lorsque le masque est égal à un. (: * est la multiplication élément par élément. * est matrice-algèbre se multiplient ... pas ce que vous voulez.)
Ce poster pourrait aider.