Si vous avez assisté au JMP Sommet Découverte 2011 à Denver, au Colorado, en septembre, vous avez peut-être assisté à ma présentation, L’image n’est pas tout, mais c’est quelque chose dans JMP 9 . J'ai parlé de la fonctionnalité d'image ajoutée à JMP pour la version 9, et moi avons présenté des exemples concrets de la façon dont les utilisateurs de JMP utilisent la fonctionnalité d’image pour extraire les données contenues dans leurs images. J'ai partagé certains scripts JSL (JMP Scripting Language) dans l'espoir de pouvoir relancer les efforts (pun-intentionnels) pour utiliser la fonctionnalité d'image. Pour la même raison, j'ai décidé de créer un fichier d'extraits de code JSL qui illustre également la fonctionnalité d'image. Ce fichier, appelé ImageExamples.jsl , peut être trouvé dans le JMP Échange de fichiers . Tirons quelques exemples de ce fichier et parlons-en un peu plus à leur sujet.
La première chose à faire est d’intégrer une image existante dans JMP. Pour ce faire, utilisez simplement la commande Nouvelle image.
img = Nouvelle image ( "C: \ Utilisateurs \ sasjvp \ Images \ Yellowstone08 \ IMG_0262.JPG" ) ;
nouvelle fenetre ( "Image originale" , img ) ;

Cet exemple lit une image JPEG et la stocke dans JSL en tant qu’objet image, appelé img. NewImage () peut lire les fichiers JPG, PNG, BMP, GIF et TIF.
Lorsque j'ai fait cela pour la première fois, la fenêtre résultante était très grande, à cause du fait que l'image était si grande. Je me demandais quelles étaient les dimensions de l'image, alors j'ai fait ceci:
{ w , h } = img << getSize () ;
Cette commande m'a donné la largeur et la hauteur de l'image, soit 3264 x 2448, une image plutôt grande. Donc, pour l'afficher dans une taille plus raisonnable, je l'ai réduit en spécifiant une nouvelle largeur et une nouvelle hauteur pour l'image.
img << setSize ( { w / 4 , h / 4 } ) ;
L'image est maintenant au format 816 x 612, soit un quart de la taille d'origine dans chaque dimension. Notez que la largeur et la hauteur sont transmises sous forme de liste en les enveloppant entre accolades.
Maintenant, je veux manipuler l'image, mais je veux conserver la version originale. Je vais donc créer une copie de mon image en utilisant NewImage ().
img2 = Nouvelle image ( img ) ;
Cela crée une copie de mon image d'origine en tant que seconde image, appelée img2.
La prochaine chose que je veux faire est d’obtenir les valeurs en pixels de l’image. Puisque mon image est une image en couleur, chaque pixel est défini en termes de trois composantes de couleur: rouge, vert et bleu. Les données de pixels sont renvoyées sous forme de matrice pour chaque composant de couleur que je demande.
{ r , g , b } = img2 << getPixels ( "rgb" ) ;
Dans ce cas, je vais obtenir trois matrices. Si mon image comportait de la transparence, je pourrais demander quatre matrices en spécifiant "rgba". Je peux aussi demander un seul composant de couleur en spécifiant simplement le composant souhaité, tel que "g" pour le composant vert. Chaque matrice représente les valeurs de couleur des pixels dans l'espace colorimétrique normalisé, ce qui signifie que les valeurs sont comprises entre 0,0 et 1,0 inclus.
La bonne chose à propos de l’obtention des valeurs de pixels sous forme de matrices est que je peux maintenant effectuer des calculs matriciels sur mes pixels. Si je voulais créer une version en niveaux de gris de mon image, je pourrais le faire très simplement avec la formule suivante.
je = .30 * r + .59 * g + 11 * b ;
C'est la même formule qu'un téléviseur utiliserait pour convertir une émission couleur en noir et blanc. Si vous êtes aussi âgé que moi, vous vous souviendrez peut-être de la télévision en noir et blanc, qui n'était pas seulement noir et blanc, mais qui incluait plutôt une gamme de gris entre noir et blanc. Cette formule combine 30% de ma composante rouge avec 59% de ma composante verte et 11% de ma composante bleue. Ceci calcule une valeur d'intensité pour mon échelle de gris. Je peux maintenant remplacer les composants de couleur d'origine rouge, vert et bleu par les valeurs d'intensité de l'échelle de gris pour produire une image en échelle de gris.
img2 << setPixels ( "rgb" , { je , je , je } ) ;
Voici le résultat.

Comme JMP prend en charge les mathématiques matricielles dans JSL, nous n’avons pas à parcourir l’image et à manipuler chaque pixel individuellement. Nous pouvons appliquer cette formule à l’ensemble de l’image en même temps, ce qui est pratique et efficace.

Bien entendu, la force réelle de JMP réside dans sa capacité à effectuer des analyses statistiques et à découvrir des données. Pour ce faire, nous avons besoin que les données se présentent sous la forme d’un tableau de données. Lisons donc dans une image, extrayons les données de pixels et créons un tableau de données.
Regardons une image prise à partir d'une IRM. Nous pouvons utiliser la commande NewImage () comme auparavant pour lire l'image dans JMP. Nous pouvons également utiliser la commande getPixels () comme auparavant, à l'exception du fait que cette image est déjà une image en niveaux de gris; nous n'avons donc besoin que d'un composant de couleur. Le premier composant est toujours appelé composant "r". Une fois que nous avons les valeurs en pixels, nous pouvons créer la table de données.
img = Nouvelle image ( "C: \ JMP \ mri.jpg" ) ;
{ pix } = img << getPixels ( "r" ) ;
dt = Nouvelle table ( "Pixel Data" ,
nouvelleColonne ( "valeurs" , définir des valeurs ( pix ))) ;
Distribution ( Distribution continue ( Colonne ( : valeurs ) , Outlier Box
Terrain ( 0 ) ) ) ;
nouvelle fenetre ( "Analyser les données d'image" , img ) ;
Les valeurs de pixels sont maintenant dans une table de données, comme toutes les autres données lues dans JMP. Cela signifie que nous pouvons maintenant utiliser les fonctionnalités d'analyse statistique de JMP pour analyser les données. Les éléments à utiliser à ce stade dépendent de la nature de vos données et des questions auxquelles vous essayez de répondre. Dans cet exemple, j'ai réalisé une simple distribution pour me montrer la plage et la fréquence de mes données.

J'espère qu'à ce stade je vous ai donné suffisamment d'exemples pour vous permettre de commencer à utiliser des images dans JMP. N'oubliez pas de télécharger le script d'exemple, ImageExamples.jsl , du JMP Échange de fichiers . Cela montre plus d'exemples que ce que j'ai mentionné ici. Il comprend des commandes de rotation, de transparence et de filtres, entre autres. Laissez-moi savoir ce que vous pensez.
Manipulation d'images dans JMP à l'aide de JSL a écrit:
[...] La commande, getPixels ("rgb"), renvoie chaque image sous forme de collection de trois matrices - une pour chaque composant de couleur, rouge, vert et bleu. Pour mélanger les images, nous multiplions Image2 par le pourcentage, puis nous l'ajoutons à Image1 multiplié par 1 moins le pourcentage. Nous définissons ensuite cela comme image résultante, Image3. C'est tout ce qu'on peut en dire. Pour plus d'explications sur getPixels (), ainsi que sur d'autres fonctionnalités d'image, consultez un autre de mes blogs, Améliorez votre image avec JMP 9. [...]