Date: Jan 10, 2013 2:19 AM Author: Murray Eisenberg Subject: Re: Cursor position on images I still don't quite understand.

In your original message, you included the following steps:

Step 2: Enter the reference points at the plot axes into the input fields. Press Enter.

Step3: Alt+Click on the point with x-coordinate x1.

This brings up the first locator visible as a circle.

Alt+Click on that with x2 which gives rise to the second locator.

Adjust the locators, if necessary.

Press the button ?Memorize scale X?.

I think you're now saying to do things in an opposite order:

(1) first put 2 by Alt+MouseClick put locators in two positions along, say, the x axis,

(2) type two corresponding x coordinates and

(3) then press the button "Memorize scale x",

(4) then pull the same locators in two points along the y axis,

(5) type the corresponding y values and

(6) press the corresponding button.

I presume this new (1) has a typo and should be simply:

(1) first put Alt+MouseClick put locators in two positions along, say, the x axis,

Assuming this new, opposite, order is what you intended.

Still, no locator appears when I Alt-click anywhere in the image output after the copyCurve[pic] is evaluated. That's using Mathematica 9.0.0 under Mac OS X 10.8.2.

I now tried the same thing, with the same image, using the Windows version of Mathematica 9.0.0 under Windows 7 (running in a virtual machine in Parallels Desktop 8 on my same Mac). Now copyCurve _does_ work.

So something's wrong with copyCurve on Mac. (Of course Alt in the Mac context means Option.) I tried the "obvious" things of Alt+Shift+Click, but that still does not produce a Locator.

Wait, the problem is with Alt-Click in Mathematica under OS X, for anything! For example, the code

Manipulate[

Graphics[{Line[u]}, PlotRange -> 2], {{u, {{-1, -1}, {1, 1}}},

Locator, LocatorAutoCreate -> True}]

from the Documentation Center does not work as expected in OS X: using Alt-Click does not create a new Locator!

[In your original message, you partially reversed steps (1) and (2). There you said

On Jan 9, 2013, at 3:33 AM, Alexei Boulbitch <Alexei.Boulbitch@iee.lu> wrote:

> Dear Murray,

>

> In principle this:

> pic = ExampleData[{"TestImage", "Lena"}]

> copyCurve[pic]

> is exactly how it should be used. I could not, however, repeat ExampleData[{"TestImage", "Lena"}] on my machine. It did not load the image for a long time, and after 5 minutes waiting I aborted it and copy-pasted Lena from Menu/Help/Image. I tried on my machine (Math9, PC, Win XP) with Lena obtained this way and it works. It is only necessary that the graphics you use has the head Image. Otherwise you can wrap it with Image. It also worked for me with PC/XP/Math8 (in which I have written it) and on PC/Win.7/Math9. I never tried it on Mac though.

>

> A minor thing is not quite correct with your sequence of actions. You should first put 2 by Alt+MouseClick put locators in two positions along, say, the x axis, type two corresponding x coordinates and then press the button "Memorize scale x", then pull the same locators in two points along the y axis, type the corresponding y values and press the corresponding button. Then use the same 2 locators at the first 2 points of the line you need to digitalize and add more locators where needed. The order x before y or y before x is of no importance. But of course, as soon as locators show up you immediately find the right way.

>

> Did you try to change the colour of the locators by the ColorSlider? They are red by default and may be poorly visible with Lena on the background.

>

> Best, Alexei

>

> Alexei BOULBITCH, Dr., habil.

> IEE S.A.

> ZAE Weiergewan,

> 11, rue Edmond Reuter,

> L-5326 Contern, LUXEMBOURG

>

> Office phone : +352-2454-2566

> Office fax: +352-2454-3566

> mobile phone: +49 151 52 40 66 44

>

> e-mail: alexei.boulbitch@iee.lu

>

>

> -----Original Message-----

> From: Murray Eisenberg [mailto:murray@math.umass.edu]

> Sent: Tuesday, January 08, 2013 6:16 PM

> To: mathgroup

> Subject: Re: Cursor position on images

>

> Either I'm not understanding the instructions for copyCurve or else something is not working right for Mathematica 9.0.0 on Mac OS X. Example:

>

> pic ExampleData[{"TestImage", "Lena"}]

> copyCurve[pic]

>

> I now type into the x1, y1, x2, y2 input fields the values 0, 0, 200, 200 respectively and press Enter.

>

> When I use Alt+Click, nothing happens -- I don't see any Locator.

>

> I also tried Shift+Alt+Click in case that's required for Mac, but still no action.

>

> On Jan 7, 2013, at 11:07 PM, Alexei Boulbitch <Alexei.Boulbitch@iee.lu> wrote:

>

>> I am sure this is straightforward but I cannot quite see how to do this. I have an image (jpg file, but could be any format if that matters). I want to be able to left click on the image and mark the point with a dot of some sort and collect the coordinates of the point (the coordinate system is fairly arbitrary). I then want to be able to repeat this as many times as required and end up with a list of the coordinates of the points clicked on for further manipulation. Clickpane should do the trick but I can't work out how.

>>

>> Any suggestions, thanks.

>>

>> Peter

>>

>> Hi, Peter,

>>

>> It is not exactly but very close to what you ask about. Below you will find a function along with its description. I use it to digitalize functions only available as curves on graphics, like taken from images. This might be what you have in mind. To try it just copy-paste any image into Mathematica, give it a name and apply the copyCurve function to it. Then act as it is described below. As the result you will get a list of points coordinates.

>>

>> Have fun, Alexei

>>

>>

>>

>> Description

>>

>> The function copyCurve enables one to get the coordinates of curve points from a plot found on an image and memorises them in a list entitled ?listOfPoints?

>> Parameters:

>>

>> image is any image. It should have Head=Image, but may be also a = Graphics object, since no specific functions of image have been used. I typically wrap it in Image[] statement.

>>

>> Controls:

>>

>> The Checkbox ?whiteLocatorRing? defines, if the locators are shown by a single color ring (unchecked), or with two rings, the outer having a color defined by the ColorSlider (see below), the innder being white. This may be helpful, if working with a too dark image.

>>

>> size controls the size of the image. The default value is 450. This slider is used to adjust the size to the one to enable the most comfortable work with the image plot.

>>

>> opacity controls the opacity of the line connecting the locators

>>

>> thickness controls the thickness of the double ring that forms each locator.

>>

>> lineThickness controls the thickness of the line connecting the locators

>>

>> color is the color slider that controls the color of the outer ring forming the locator and the line connecting them. The inned locator ring is always white.

>>

>> radius controls the radius of the locators.

>>

>> InputFields: should be supplied by the reference points x1 and x2 at the axis x, as well as y1 and y2 at the axis y.

>>

>> Buttons: The buttons ?Memorize scale X? and ?Memorize scale Y? should be pressed after the first two locators are placed on the corresponding reference points (presumably, located at the x or y axes). Upon pressing the reference points are memorized. The button ?Make list of the curve points? should be pressed at the end of the session. Upon its pressing the actual list of points representing the points of the curve is assigned to the global variable ?listOfPoints?

>>

>>

>> Operation:

>> Step 1: Execute the function with the name of the image containing the curve to be digitalized.

>>

>> Step 2: Enter the reference points at the plot axes into the input fields. Press Enter.

>>

>> Step3: Alt+Click on the point with x-coordinate x1. This brings up the first locator visible as a circle. Alt+Click on that with x2 which gives rise to the second locator. Adjust the locators, if necessary. Press the button ?Memorize scale X?.

>>

>> Step 4: Move the two already existing locators to the points with the coordinates y1 and y2. Press the button ?Memorize scale Y?. Now the both scales are captured.

>>

>> Step 5: Move the two already existing locators to the first two points of the curve to be captured. Alt+Click on other points of the curve. Each Alt+Click will generate an additional locator. Adjust

locators, if necessary. To remove, Alt+Click on unnecessary locators.

>>

>> Step 6: Press the button ?Make the list...?. This assigns the captured list to the variable ?listOfPoints?. Done.

>>

>> The ?listOfPoints? is a global variable. It can be addressed everywhere in the notebook.

>>

>> The function copyCurve

>>

>> Clear[copyCurve];

>>

>> copyCurve[image_] :=

>>

>> Manipulate[

>> DynamicModule[{pts = {}, x1 = Null, x2 = Null, y1 = Null,

>> y2 = Null, X1, X2, Y1, Y2, \[CapitalDelta]X, \[CapitalDelta]Y, =

g,

>> myRound},

>>

>> myRound[x_] := Round[1000.*x]/1000. // N;

>>

>> (* Begins the column with all the content of the manipulate *)

>> Column[{

>> (* Begin LocatorPane*)

>> Dynamic@LocatorPane[Union[Dynamic[pts]],

>> Dynamic@

>> Show[{ReplacePart[image, {4, 2} -> size],

>> Graphics[{color, AbsoluteThickness[lineThickness],

>> Opacity[opacity], Line[Union[pts]]}]

>> }], LocatorAutoCreate -> True,

>> (* Begin Locator appearance *)

>> Appearance -> If[whiteLocatorRing,

>>

>> Graphics[{{color, AbsoluteThickness[thickness],

>> Circle[{0, 0}, radius + thickness/2]}, {White,

>> AbsoluteThickness[thickness], Circle[{0, 0}, radius]}},

>> ImageSize -> 10]

>> ,

>> Graphics[{{color, AbsoluteThickness[thickness],

>> Circle[{0, 0}, radius + thickness/2]}},

>> ImageSize -> 10]](* End Locator appearance *)

>> ],(* End LocatorPane*)

>>

>> (* Begin of the block of InputFields *)

>> , Row[{ Style["\!\(\*SubscriptBox[\(x\), \(1\)]\):"],

>> InputField[Dynamic[x1],

>> FieldHint -> "Type \!\(\*SubscriptBox[\(x\), \(1\)]\)",

>> FieldSize -> 7, FieldHintStyle -> {Red}],

>> Spacer[20], Style[" \!\(\*SubscriptBox[\(y\), \(1\)]\):"],

>> InputField[Dynamic[y1],

>> FieldHint -> "Type \!\(\*SubscriptBox[\(y\), \(1\)]\)",

>> FieldSize -> 7, FieldHintStyle -> {Red}]

>> }],

>> Row[{ Style["\!\(\*SubscriptBox[\(x\), \(2\)]\):"],

>> InputField[Dynamic[x2],

>> FieldHint -> "Type \!\(\*SubscriptBox[\(x\), \(2\)]\)",

>> FieldSize -> 7, FieldHintStyle -> {Red}],

>> Spacer[20], Style[" \!\(\*SubscriptBox[\(y\), \(2\)]\):"],

>> InputField[Dynamic[y2],

>> FieldHint ->

>> "Type \!\(\*SubscriptBox[\(y\), \(2\)]\)+Enter",

>> FieldSize -> 7, FieldHintStyle -> {Red}]

>> }],

>> (* End of the block of InputFields *)

>> (* Begin the buttons row *)

>> Row[{Spacer[15],

>> (* Begin button "Memorize scale X" *)

>> Button["Memorize scale X",

>> X1 = Min[Transpose[myRound /@ Union[pts]][[1]]];

>> X2 = Max[Transpose[myRound /@ Union[pts]][[1]]];

>> \[CapitalDelta]X = X2 - X1;

>> ],(* End of button "Memorize scale X" *)

>> Spacer[70],

>> (* Begin button "Memorize scale Y" *)

>> Button["Memorize scale Y",

>> Y1 = Min[Transpose[myRound /@ Union[pts]][[2]]];

>> Y2 = Max[Transpose[myRound /@ Union[pts]][[2]]];

>> \[CapitalDelta]Y = Y2 - Y1;

>> ](* End of button "Memorize scale Y" *)

>>

>>

>> }],(* End the buttons row *)

>> Spacer[0],

>>

>> (* Begin button "Make the list of the curve's points" *)

>> Button[Style["Make the list of the curve's points" , Bold],

>> g[{a_, b_}] := {(x1*X2 - x2*X1)/\[CapitalDelta]X +

>> a/\[CapitalDelta]X*Abs[x2 - x1], (

>> y1*Y2 - y2*Y1)/\[CapitalDelta]Y +

>> b/\[CapitalDelta]Y*Abs[y2 - y1]};

>> Clear[listOfPoints];

>> listOfPoints = Map[myRound, Map[g, pts]]

>> ](* End of button "Make the list..." *)

>>

>> }, Alignment -> Center](*

>> End of column with all the content of the manipulate *)

>> ],(* End of the DynamicModule *)

>>

>> (* The massive of sliders begins *)

>> Column[{Row[{Control[{whiteLocatorRing, {True, False}}],

>> Spacer[50]}],

>> Row[{Spacer[32.35], Control[{{size, 450}, 300, 800}],

>> Spacer[38.5`], Control[{{opacity, 0.5}, 0, 1}]}],

>> Row[{Spacer[10.], Control[{{thickness, 1}, 0.5, 5}],

>> Spacer[13.65], Control[{{lineThickness, 1}, 0, 10}] }],

>> Row[{Spacer[22.8], Control[{color, Red}], Spacer[59.3],

>> Control[{{radius, 0.5}, 0, 3}]}]

>> }, Alignment -> Center],(* The massive of sliders ends *)

>>

>> (* Definitions of sliders *)

>> ControlType -> {Checkbox, Slider, Slider, Slider, Slider,

>> ColorSlider, Slider},

>> ControlPlacement -> Top, SaveDefinitions -> True

>> ];

>> (* End of the function *)

>>

>>

>> Alexei BOULBITCH, Dr., habil.

>> IEE S.A.

>> ZAE Weiergewan,

>> 11, rue Edmond Reuter,

>> L-5326 Contern, LUXEMBOURG

>>

>> Office phone : +352-2454-2566

>> Office fax: +352-2454-3566

>> mobile phone: +49 151 52 40 66 44

>>

>> e-mail: alexei.boulbitch@iee.lu

>

> ---

> Murray Eisenberg =

murray@math.umass.edu

> Mathematics & Statistics Dept.

> Lederle Graduate Research Tower phone 413 549-1020 (H)

> University of Massachusetts 413 545-2838 =

(W)

> 710 North Pleasant Street fax 413 545-1801

> Amherst, MA 01003-9305

>

>

>

>

>

>

---

Murray Eisenberg =

murray@math.umass.edu

Mathematics & Statistics Dept.

Lederle Graduate Research Tower phone 413 549-1020 (H)

University of Massachusetts 413 545-2838 =

(W)

710 North Pleasant Street fax 413 545-1801

Amherst, MA 01003-9305