Problème
Vous avez une matrice 2D. Vous avez utilisé la fonction Loc pour localiser des éléments intéressants, mais Loc a renvoyé des index pour une matrice 1D. Comment reconvertir les index 1D en index 2D ?
Solution
Vous devrez utiliser les fonctions Floor et Mod et connaître le nombre de colonnes dans votre matrice 2D. Voici les trois lignes, enterrées dans l'exemple commenté ci-dessous. pixmat est une matrice 2D, Loc trouve les pixels non nuls, qui sont noirs :
blacklocs = (Loc( pixmat ) - 1); // blacklocs est une matrice d'index 1D (base 0)
rowlocs = Floor( (blacklocs) / nc ) + 1; // nc est le nombre de colonnes dans le pixmat 2D
collocs = Mod( (blacklocs), nc ) + 1 ; // les rowlocs et les collocs sont des index 2D (base 1)
// we need a bitmap to work with; use a text box with a moderate size font
textbox = Text Box( "Gargoyle", <<SETFONTSIZE> .5 are antialiasing fading to white background of the "paper".
// the next statement makes the 0 to .5 values be 1 and the .5 to 1 values be 0
pixmat = pixmat < .75; // cut off edge at some gray value. flip the 0..1 significance.
// the pixels are in a 2D matrix of rows and cols. get the dimensions.
nr = N Rows( pixmat );
nc = N Cols( pixmat );
// now we can find the location of the black pixels (1s) that form the text.
// the LOC function returns a 1D matrix of the offsets of non-zero
// elements in the 2D matrix pixmat. if pixmat was 3 rows of 5 elements each,
// the LOC could return a 1D matrix of 0 to 15 elements with values from 1 to 15.
// JMP uses 1-based indexing. subtract one to get 0-based for future steps.
blacklocs = (Loc( pixmat ) - 1);
// Here's the JSL that convers the 1D answers back to 2D answers.
// use the 0-based blacklocs (previous statement), then add 1 to
// turn the 0-based results back into the 1-based indexes JMP expects.
rowlocs = Floor( (blacklocs) / nc ) + 1;
collocs = Mod( (blacklocs), nc ) + 1;
// Show the results
scale = 16; // try bigger or smaller scale for your screen size
New Window( "Example",
Graph Box(
// make the graph the same aspect ratio as the bitmap
framesize( nc * scale, nr * scale ),
// make the point marker size big; .65 is approximately right
<<MARKER size=""></MARKER></SETFONTSIZE>
Pixels from a bitmap, displayed as markers in a graphPixels from a bitmap, displayed as markers in a graphPixels d'un bitmap, affichés sous forme de marqueurs dans un graphique
Discussion
Les -1 et +1 sont importants, ne les laissez pas de côté. Lisez les commentaires basés sur 1 et basés sur 0 dans le JSL.
Le texte du bitmap est anticrénelé, ce qui signifie que les pixels de bord sont des nuances de gris proportionnelles à la façon dont le bord parfait du caractère serait tombé entre les pixels. J'ai choisi un seuil de gris de .75 car j'aimais mieux le résultat que .5; votre application ne traitera probablement pas de cela du tout.
La fonction Shape() de JMP convertit la forme d'une matrice. Cela n'aidera pas ici.
De nombreuses instructions de l'exemple fonctionnent sur une matrice sans utiliser de boucle for JSL explicite. Bon pour la vitesse.
Voir également
https://www.jmp.com/support/help/14-2/matrix-functions.shtml
voir également: Qu'est-ce que la matrice JSL ? pour une introduction aux matrices dans JMP.