MathGroup Archive 2013

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Cursor position on images

  • To: mathgroup at smc.vnet.net
  • Subject: [mg129374] Re: Cursor position on images
  • From: Murray Eisenberg <murray at math.umass.edu>
  • Date: Tue, 8 Jan 2013 23:39:25 -0500 (EST)
  • Delivered-to: l-mathgroup@mail-archive0.wolfram.com
  • Delivered-to: l-mathgroup@wolfram.com
  • Delivered-to: mathgroup-newout@smc.vnet.net
  • Delivered-to: mathgroup-newsend@smc.vnet.net
  • References: <20130108040700.E610D687E@smc.vnet.net>

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 at 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 at iee.lu

---
Murray Eisenberg                                    
murray at 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








  • Prev by Date: Re: get all Section cells
  • Next by Date: Re: system of differential equations mathematica help
  • Previous by thread: Re: Cursor position on images
  • Next by thread: Re: Cursor position on images