overlays

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
5 messages Options
Reply | Threaded
Open this post in threaded view
|

overlays

dobensl
I’ve written a macro that identifies hairs in a photomicrograph, outlines them and draws colored arrows across their Feret’s width with the arrowhead pointing to the thin end of the hair and with a color assigned correlating with the Feret’s angle (calculated over 360 degrees).

I’d like to overlay these arrow on the original image. It works well with a simpler macro making all the arrows are black or all are white, but when I used the colored arrows macro, the overlay is converted to green. Any idea why?

Here’s the very end of the macro (whole macro below)

for (i=0; i<nResults; i++) {
    r = getResult("R",i);
    g = getResult("G",i);
    b = getResult("B",i);
xh = getResult("xh",i);
xt = getResult("xt",i);
yh = getResult("yh",i);
yt = getResult("yt",i);

run("Draw", "slice");
      setTool("arrow");
      run("Color Picker...");
setForegroundColor(r, g, b);
      makeArrow(xt, yt, xh, yh, "notched");
Roi.setStrokeWidth(width);
Overlay.addSelection();
Overlay.copy;
}
run("Close");
open(path_name);
run("Color Picker...");
setForegroundColor(r, g, b);
Overlay.paste;

/////////////////////////////////////////

Here’s the whole macro

var path_name = getDirectory("image")+ getInfo("image.filename");

run("Revert");


  setAutoThreshold("Default");
 run("Set Measurements...", "centroid center feret's redirect=None decimal=3");
 run("Analyze Particles...", "  show=[Overlay Outlines] display exclude clear");
 run("To ROI Manager");
 roiManager("Show All without labels");

title = "Untitled";
  width=512; height=512;
  Dialog.create("Set Arrow");
  Dialog.addNumber("Width:", 51);
  Dialog.show();
  width = Dialog.getNumber();

  resetThreshold();
  Overlay.drawLabels(false);

for (i=0; i<nResults; i++) {
     x11 = getResult("FeretX",i);
     y11 = getResult("FeretY",i);
     length = getResult("Feret",i);
     degrees = getResult("FeretAngle",i);
     if (degrees>90)
        degrees -= 180;
     angle = degrees*PI/180;
     x21 = x11 + cos(angle)*length;
     setResult("x21", i, x21);
     y21 = y11 - sin(angle)*length;
     setResult("y21", i, y21);

     x31 = getResult("X",i);
     y31 = getResult("Y",i);

     makeLine(x31, y31, x11, y11);
     getPixelSize(unit, pw, ph);
     dz = (x31 - x11)*pw;
     da = (y31 - y11)*ph;
     distance1 = sqrt(dz*dz + da*da);
     setResult("D1", i, distance1);
     updateResults;


  makeLine(x31, y31, x21, y21);
     getPixelSize(unit, pw, ph);
     dx = (x31 - x21)*pw;
     dy = (y31 - y21)*ph;
     distance2 = sqrt(dx*dx + dy*dy);
     setResult("D2", i, distance2);
     updateResults;

}

for (i=0; i<nResults; i++) {

     D1 = getResult("D1",i);
     D2 = getResult("D2",i);
     x11 = getResult("FeretX",i);
     y11 = getResult("FeretY",i);
     x21 = getResult("x21",i);
     y21 = getResult("y21",i);

     if (D1 > D2) {
      setResult("xh", i, x11);
  setResult("xt", i, x21);
  setResult("yh", i, y11);
  setResult("yt", i, y21);
  updateResults;setTool("arrow");

   } else {

setResult("xh", i, x21);
  setResult("xt", i, x11);
setResult("yh", i, y21);
setResult("yt", i, y11);
  }
}

for (i=0; i<nResults; i++) {
xh = getResult("xh",i);
xt = getResult("xt",i);
yh = getResult("yh",i);
yt = getResult("yt",i);
degrees = getResult("FeretAngle",i);


if (xh > xt && yh < yt){
angle2 = degrees + 180;
setResult("angle360", i, angle2);
updateResults;
}

if (xh < xt && yh > yt){
angle2 = degrees + 0;
setResult("angle360", i, angle2);
updateResults;
}

if (xh > xt && yh > yt){
angle2 = degrees + 0;
setResult("angle360", i, angle2);
updateResults;
}

if (xh < xt && yh < yt){
angle2 = degrees + 180;
setResult("angle360", i, angle2);
}
}
run("RGB Color");

for (i=0; i<nResults; i++) {
a = getResult("angle360",i);

if (0 < a && a < 60){
r = 255;
g = 4.25*a;
b = 0;
setResult("R", i, r);
setResult("G", i, g);
setResult("B", i, b);
updateResults;
}

if (61 < a && a < 120){
r = -4.25*a + 510;
g = 255;
b = 0;
setResult("R", i, r);
setResult("G", i, g);
setResult("B", i, b);
updateResults;
}
if (121 < a && a< 180){
r = 0;
g = 255;
b = 4.25*a - 510;
setResult("R", i, r);
setResult("G", i, g);
setResult("B", i, b);
updateResults;
}
if (181 < a && a < 240){
r = 0;
g = -4.25*a + 1020;
b = 255;
setResult("R", i, r);
setResult("G", i, g);
setResult("B", i, b);
updateResults;
}
if (241 < a && a < 300){
r = 4.25*a - 1020;
g = 0;
b = 255;
setResult("R", i, r);
setResult("G", i, g);
setResult("B", i, b);
updateResults;
}
if (301 < a && a < 360){
r = 255;
g = 0;
b = -4.25*a + 1530;
setResult("R", i, r);
setResult("G", i, g);
setResult("B", i, b);
updateResults;
}
}

for (i=0; i<nResults; i++) {
    r = getResult("R",i);
    g = getResult("G",i);
    b = getResult("B",i);
xh = getResult("xh",i);
xt = getResult("xt",i);
yh = getResult("yh",i);
yt = getResult("yt",i);

run("Draw", "slice");
      setTool("arrow");
      run("Color Picker...");
setForegroundColor(r, g, b);
      makeArrow(xt, yt, xh, yh, "notched");
Roi.setStrokeWidth(width);
Overlay.addSelection();
Overlay.copy;
}
run("Close");
open(path_name);
run("Color Picker...");
setForegroundColor(r, g, b);
Overlay.paste;



Len Dobens


Leonard Dobens, PhD
Professor of Molecular Biology and Biochemistry
SCB312
School of Biological Sciences
University of Missouri-Kansas City
5007 Rockhill Road
Kansas City, MO 64110
8162356272
[hidden email]<mailto:[hidden email]>




--
ImageJ mailing list: http://imagej.nih.gov/ij/list.html
Reply | Threaded
Open this post in threaded view
|

Re: overlays

Rasband, Wayne (NIH/NIMH) [E]

> On Jan 3, 2017, at 5:36 PM, Dobens, Leonard <[hidden email]> wrote:
>
> I’ve written a macro that identifies hairs in a photomicrograph, outlines them and draws colored arrows across their Feret’s width with the arrowhead pointing to the thin end of the hair and with a color assigned correlating with the Feret’s angle (calculated over 360 degrees).
>
> I’d like to overlay these arrow on the original image. It works well with a simpler macro making all the arrows are black or all are white, but when I used the colored arrows macro, the overlay is converted to green. Any idea why?

It would be very helpful if you could provide a small, self-contained macro that reproduces the problem. The following macro works as expected. It requires the latest ImageJ daily build (1.51j9), which adds the Roi.setStrokeColor(r,g,b) macro function.

-wayne

  requires("1.51j");
  newImage("Untitled", "8-bit black", 720, 576, 1);
  makeArrow(337, 85, 205, 212, "notched large");
  Roi.setStrokeWidth(3);
  Roi.setStrokeColor(255, 200, 100);
  run("Add Selection...");
  makeArrow(50, 130, 185, 213, "notched large");
  Roi.setStrokeWidth(3);
  Roi.setStrokeColor(255, 0, 0);
  run("Add Selection...");
  makeArrow(201, 435, 195, 240, "notched large");
  Roi.setStrokeWidth(3);
  Roi.setStrokeColor(50, 100, 255);
  run("Add Selection...");
  Overlay.copy;
  wait(2000);
  close;
  run("Boats (356K)");
  Overlay.paste;


> Here’s the very end of the macro (whole macro below)
>
> for (i=0; i<nResults; i++) {
>    r = getResult("R",i);
>    g = getResult("G",i);
>    b = getResult("B",i);
> xh = getResult("xh",i);
> xt = getResult("xt",i);
> yh = getResult("yh",i);
> yt = getResult("yt",i);
>
> run("Draw", "slice");
>      setTool("arrow");
>      run("Color Picker...");
> setForegroundColor(r, g, b);
>      makeArrow(xt, yt, xh, yh, "notched");
> Roi.setStrokeWidth(width);
> Overlay.addSelection();
> Overlay.copy;
> }
> run("Close");
> open(path_name);
> run("Color Picker...");
> setForegroundColor(r, g, b);
> Overlay.paste;
>
> /////////////////////////////////////////
>
> Here’s the whole macro
>
> var path_name = getDirectory("image")+ getInfo("image.filename");
>
> run("Revert");
>
>
>  setAutoThreshold("Default");
> run("Set Measurements...", "centroid center feret's redirect=None decimal=3");
> run("Analyze Particles...", "  show=[Overlay Outlines] display exclude clear");
> run("To ROI Manager");
> roiManager("Show All without labels");
>
> title = "Untitled";
>  width=512; height=512;
>  Dialog.create("Set Arrow");
>  Dialog.addNumber("Width:", 51);
>  Dialog.show();
>  width = Dialog.getNumber();
>
>  resetThreshold();
>  Overlay.drawLabels(false);
>
> for (i=0; i<nResults; i++) {
>     x11 = getResult("FeretX",i);
>     y11 = getResult("FeretY",i);
>     length = getResult("Feret",i);
>     degrees = getResult("FeretAngle",i);
>     if (degrees>90)
>        degrees -= 180;
>     angle = degrees*PI/180;
>     x21 = x11 + cos(angle)*length;
>     setResult("x21", i, x21);
>     y21 = y11 - sin(angle)*length;
>     setResult("y21", i, y21);
>
>     x31 = getResult("X",i);
>     y31 = getResult("Y",i);
>
>     makeLine(x31, y31, x11, y11);
>     getPixelSize(unit, pw, ph);
>     dz = (x31 - x11)*pw;
>     da = (y31 - y11)*ph;
>     distance1 = sqrt(dz*dz + da*da);
>     setResult("D1", i, distance1);
>     updateResults;
>
>
>  makeLine(x31, y31, x21, y21);
>     getPixelSize(unit, pw, ph);
>     dx = (x31 - x21)*pw;
>     dy = (y31 - y21)*ph;
>     distance2 = sqrt(dx*dx + dy*dy);
>     setResult("D2", i, distance2);
>     updateResults;
>
> }
>
> for (i=0; i<nResults; i++) {
>
>     D1 = getResult("D1",i);
>     D2 = getResult("D2",i);
>     x11 = getResult("FeretX",i);
>     y11 = getResult("FeretY",i);
>     x21 = getResult("x21",i);
>     y21 = getResult("y21",i);
>
>     if (D1 > D2) {
>      setResult("xh", i, x11);
>  setResult("xt", i, x21);
>  setResult("yh", i, y11);
>  setResult("yt", i, y21);
>  updateResults;setTool("arrow");
>
>   } else {
>
> setResult("xh", i, x21);
>  setResult("xt", i, x11);
> setResult("yh", i, y21);
> setResult("yt", i, y11);
>  }
> }
>
> for (i=0; i<nResults; i++) {
> xh = getResult("xh",i);
> xt = getResult("xt",i);
> yh = getResult("yh",i);
> yt = getResult("yt",i);
> degrees = getResult("FeretAngle",i);
>
>
> if (xh > xt && yh < yt){
> angle2 = degrees + 180;
> setResult("angle360", i, angle2);
> updateResults;
> }
>
> if (xh < xt && yh > yt){
> angle2 = degrees + 0;
> setResult("angle360", i, angle2);
> updateResults;
> }
>
> if (xh > xt && yh > yt){
> angle2 = degrees + 0;
> setResult("angle360", i, angle2);
> updateResults;
> }
>
> if (xh < xt && yh < yt){
> angle2 = degrees + 180;
> setResult("angle360", i, angle2);
> }
> }
> run("RGB Color");
>
> for (i=0; i<nResults; i++) {
> a = getResult("angle360",i);
>
> if (0 < a && a < 60){
> r = 255;
> g = 4.25*a;
> b = 0;
> setResult("R", i, r);
> setResult("G", i, g);
> setResult("B", i, b);
> updateResults;
> }
>
> if (61 < a && a < 120){
> r = -4.25*a + 510;
> g = 255;
> b = 0;
> setResult("R", i, r);
> setResult("G", i, g);
> setResult("B", i, b);
> updateResults;
> }
> if (121 < a && a< 180){
> r = 0;
> g = 255;
> b = 4.25*a - 510;
> setResult("R", i, r);
> setResult("G", i, g);
> setResult("B", i, b);
> updateResults;
> }
> if (181 < a && a < 240){
> r = 0;
> g = -4.25*a + 1020;
> b = 255;
> setResult("R", i, r);
> setResult("G", i, g);
> setResult("B", i, b);
> updateResults;
> }
> if (241 < a && a < 300){
> r = 4.25*a - 1020;
> g = 0;
> b = 255;
> setResult("R", i, r);
> setResult("G", i, g);
> setResult("B", i, b);
> updateResults;
> }
> if (301 < a && a < 360){
> r = 255;
> g = 0;
> b = -4.25*a + 1530;
> setResult("R", i, r);
> setResult("G", i, g);
> setResult("B", i, b);
> updateResults;
> }
> }
>
> for (i=0; i<nResults; i++) {
>    r = getResult("R",i);
>    g = getResult("G",i);
>    b = getResult("B",i);
> xh = getResult("xh",i);
> xt = getResult("xt",i);
> yh = getResult("yh",i);
> yt = getResult("yt",i);
>
> run("Draw", "slice");
>      setTool("arrow");
>      run("Color Picker...");
> setForegroundColor(r, g, b);
>      makeArrow(xt, yt, xh, yh, "notched");
> Roi.setStrokeWidth(width);
> Overlay.addSelection();
> Overlay.copy;
> }
> run("Close");
> open(path_name);
> run("Color Picker...");
> setForegroundColor(r, g, b);
> Overlay.paste;
>
>
>
> Len Dobens
>
>
> Leonard Dobens, PhD
> Professor of Molecular Biology and Biochemistry
> SCB312
> School of Biological Sciences
> University of Missouri-Kansas City
> 5007 Rockhill Road
> Kansas City, MO 64110
> 8162356272
> [hidden email]<mailto:[hidden email]>
>
>
>
>
> --
> ImageJ mailing list: http://imagej.nih.gov/ij/list.html


--
ImageJ mailing list: http://imagej.nih.gov/ij/list.html
Reply | Threaded
Open this post in threaded view
|

Re: overlays

dobensl
A couple of problems in running your macro. The 1.51j version is not available, only 1.51i. Also when I do run your macro in “i” version, the command "Roi.setStrokeColor(255, 0, 0);” is not happy with RGB values - appears that only hex numbers are allowed (Does the “j” version permit RGB? that could address my problems).

I recognized that Roi.setStrokeColor() arrows drawn manually and colored by a hex value could be overplayed properly and I have tried to put together a hex converter for my RGB values, and while that change in the macro effectively removes the green arrows, the colors are now black with a couple of blue arrows, so my hex converter (as written) is not good.

The “green arrows” that come from the macro code cited below:
   run("Color Picker...");
setForegroundColor(r, g, b);
    makeArrow(xt, yt, xh, yh, "notched");
Roi.setStrokeWidth(width);
Overlay.addSelection();
Overlay.copy;
may result from a "select arrow” appearance (green), that if I could “de-select” all, may reveal their underlying proper color

Len



On Jan 3, 2017, at 10:17 PM, Rasband, Wayne (NIH/NIMH) [E] <[hidden email]<mailto:[hidden email]>> wrote:


On Jan 3, 2017, at 5:36 PM, Dobens, Leonard <[hidden email]<mailto:[hidden email]>> wrote:

I’ve written a macro that identifies hairs in a photomicrograph, outlines them and draws colored arrows across their Feret’s width with the arrowhead pointing to the thin end of the hair and with a color assigned correlating with the Feret’s angle (calculated over 360 degrees).

I’d like to overlay these arrow on the original image. It works well with a simpler macro making all the arrows are black or all are white, but when I used the colored arrows macro, the overlay is converted to green. Any idea why?

It would be very helpful if you could provide a small, self-contained macro that reproduces the problem. The following macro works as expected. It requires the latest ImageJ daily build (1.51j9), which adds the Roi.setStrokeColor(r,g,b) macro function.

-wayne

 requires("1.51j");
 newImage("Untitled", "8-bit black", 720, 576, 1);
 makeArrow(337, 85, 205, 212, "notched large");
 Roi.setStrokeWidth(3);
 Roi.setStrokeColor(255, 200, 100);
 run("Add Selection...");
 makeArrow(50, 130, 185, 213, "notched large");
 Roi.setStrokeWidth(3);
 Roi.setStrokeColor(255, 0, 0);
 run("Add Selection...");
 makeArrow(201, 435, 195, 240, "notched large");
 Roi.setStrokeWidth(3);
 Roi.setStrokeColor(50, 100, 255);
 run("Add Selection...");
 Overlay.copy;
 wait(2000);
 close;
 run("Boats (356K)");
 Overlay.paste;


Here’s the very end of the macro (whole macro below)

for (i=0; i<nResults; i++) {
  r = getResult("R",i);
  g = getResult("G",i);
  b = getResult("B",i);
xh = getResult("xh",i);
xt = getResult("xt",i);
yh = getResult("yh",i);
yt = getResult("yt",i);

run("Draw", "slice");
    setTool("arrow");
    run("Color Picker...");
setForegroundColor(r, g, b);
    makeArrow(xt, yt, xh, yh, "notched");
Roi.setStrokeWidth(width);
Overlay.addSelection();
Overlay.copy;
}
run("Close");
open(path_name);
run("Color Picker...");
setForegroundColor(r, g, b);
Overlay.paste;

/////////////////////////////////////////

Here’s the whole macro

var path_name = getDirectory("image")+ getInfo("image.filename");

run("Revert");


setAutoThreshold("Default");
run("Set Measurements...", "centroid center feret's redirect=None decimal=3");
run("Analyze Particles...", "  show=[Overlay Outlines] display exclude clear");
run("To ROI Manager");
roiManager("Show All without labels");

title = "Untitled";
width=512; height=512;
Dialog.create("Set Arrow");
Dialog.addNumber("Width:", 51);
Dialog.show();
width = Dialog.getNumber();

resetThreshold();
Overlay.drawLabels(false);

for (i=0; i<nResults; i++) {
   x11 = getResult("FeretX",i);
   y11 = getResult("FeretY",i);
   length = getResult("Feret",i);
   degrees = getResult("FeretAngle",i);
   if (degrees>90)
      degrees -= 180;
   angle = degrees*PI/180;
   x21 = x11 + cos(angle)*length;
   setResult("x21", i, x21);
   y21 = y11 - sin(angle)*length;
   setResult("y21", i, y21);

   x31 = getResult("X",i);
   y31 = getResult("Y",i);

   makeLine(x31, y31, x11, y11);
   getPixelSize(unit, pw, ph);
   dz = (x31 - x11)*pw;
   da = (y31 - y11)*ph;
   distance1 = sqrt(dz*dz + da*da);
   setResult("D1", i, distance1);
   updateResults;


makeLine(x31, y31, x21, y21);
   getPixelSize(unit, pw, ph);
   dx = (x31 - x21)*pw;
   dy = (y31 - y21)*ph;
   distance2 = sqrt(dx*dx + dy*dy);
   setResult("D2", i, distance2);
   updateResults;

}

for (i=0; i<nResults; i++) {

   D1 = getResult("D1",i);
   D2 = getResult("D2",i);
   x11 = getResult("FeretX",i);
   y11 = getResult("FeretY",i);
   x21 = getResult("x21",i);
   y21 = getResult("y21",i);

   if (D1 > D2) {
    setResult("xh", i, x11);
setResult("xt", i, x21);
setResult("yh", i, y11);
setResult("yt", i, y21);
updateResults;setTool("arrow");

 } else {

setResult("xh", i, x21);
setResult("xt", i, x11);
setResult("yh", i, y21);
setResult("yt", i, y11);
}
}

for (i=0; i<nResults; i++) {
xh = getResult("xh",i);
xt = getResult("xt",i);
yh = getResult("yh",i);
yt = getResult("yt",i);
degrees = getResult("FeretAngle",i);


if (xh > xt && yh < yt){
angle2 = degrees + 180;
setResult("angle360", i, angle2);
updateResults;
}

if (xh < xt && yh > yt){
angle2 = degrees + 0;
setResult("angle360", i, angle2);
updateResults;
}

if (xh > xt && yh > yt){
angle2 = degrees + 0;
setResult("angle360", i, angle2);
updateResults;
}

if (xh < xt && yh < yt){
angle2 = degrees + 180;
setResult("angle360", i, angle2);
}
}
run("RGB Color");

for (i=0; i<nResults; i++) {
a = getResult("angle360",i);

if (0 < a && a < 60){
r = 255;
g = 4.25*a;
b = 0;
setResult("R", i, r);
setResult("G", i, g);
setResult("B", i, b);
updateResults;
}

if (61 < a && a < 120){
r = -4.25*a + 510;
g = 255;
b = 0;
setResult("R", i, r);
setResult("G", i, g);
setResult("B", i, b);
updateResults;
}
if (121 < a && a< 180){
r = 0;
g = 255;
b = 4.25*a - 510;
setResult("R", i, r);
setResult("G", i, g);
setResult("B", i, b);
updateResults;
}
if (181 < a && a < 240){
r = 0;
g = -4.25*a + 1020;
b = 255;
setResult("R", i, r);
setResult("G", i, g);
setResult("B", i, b);
updateResults;
}
if (241 < a && a < 300){
r = 4.25*a - 1020;
g = 0;
b = 255;
setResult("R", i, r);
setResult("G", i, g);
setResult("B", i, b);
updateResults;
}
if (301 < a && a < 360){
r = 255;
g = 0;
b = -4.25*a + 1530;
setResult("R", i, r);
setResult("G", i, g);
setResult("B", i, b);
updateResults;
}
}

for (i=0; i<nResults; i++) {
  r = getResult("R",i);
  g = getResult("G",i);
  b = getResult("B",i);
xh = getResult("xh",i);
xt = getResult("xt",i);
yh = getResult("yh",i);
yt = getResult("yt",i);

run("Draw", "slice");
    setTool("arrow");
    run("Color Picker...");
setForegroundColor(r, g, b);
    makeArrow(xt, yt, xh, yh, "notched");
Roi.setStrokeWidth(width);
Overlay.addSelection();
Overlay.copy;
}
run("Close");
open(path_name);
run("Color Picker...");
setForegroundColor(r, g, b);
Overlay.paste;



Len Dobens


Leonard Dobens, PhD
Professor of Molecular Biology and Biochemistry
SCB312
School of Biological Sciences
University of Missouri-Kansas City
5007 Rockhill Road
Kansas City, MO 64110
8162356272
[hidden email]<mailto:[hidden email]><mailto:[hidden email]>




--
ImageJ mailing list: http://imagej.nih.gov/ij/list.html


--
ImageJ mailing list: http://imagej.nih.gov/ij/list.html

Leonard Dobens, PhD
Professor of Molecular Biology and Biochemistry
SCB312
School of Biological Sciences
University of Missouri-Kansas City
5007 Rockhill Road
Kansas City, MO 64110
8162356272
[hidden email]<mailto:[hidden email]>




--
ImageJ mailing list: http://imagej.nih.gov/ij/list.html
Reply | Threaded
Open this post in threaded view
|

Re: overlays

CARL Philippe (LBP)
Dear Len,
If you do "Help->Update_ImageJ..." and from there you choose the "daily build" version you will end up with the version v1.51j9.
And I tried the macro Wayne sent you on this daily build version and it is working as a charm.
And the same macro is not working properly if you stay within the version 1.51i.
My best regards,
Philippe

-----Message d'origine-----
De : ImageJ Interest Group [mailto:[hidden email]] De la part de Dobens, Leonard
Envoyé : jeudi 5 janvier 2017 01:33
À : [hidden email]
Objet : Re: overlays

A couple of problems in running your macro. The 1.51j version is not available, only 1.51i. Also when I do run your macro in “i” version, the command "Roi.setStrokeColor(255, 0, 0);” is not happy with RGB values - appears that only hex numbers are allowed (Does the “j” version permit RGB? that could address my problems).

I recognized that Roi.setStrokeColor() arrows drawn manually and colored by a hex value could be overplayed properly and I have tried to put together a hex converter for my RGB values, and while that change in the macro effectively removes the green arrows, the colors are now black with a couple of blue arrows, so my hex converter (as written) is not good.

The “green arrows” that come from the macro code cited below:
   run("Color Picker...");
setForegroundColor(r, g, b);
    makeArrow(xt, yt, xh, yh, "notched"); Roi.setStrokeWidth(width); Overlay.addSelection(); Overlay.copy; may result from a "select arrow” appearance (green), that if I could “de-select” all, may reveal their underlying proper color

Len



On Jan 3, 2017, at 10:17 PM, Rasband, Wayne (NIH/NIMH) [E] <[hidden email]<mailto:[hidden email]>> wrote:


On Jan 3, 2017, at 5:36 PM, Dobens, Leonard <[hidden email]<mailto:[hidden email]>> wrote:

I’ve written a macro that identifies hairs in a photomicrograph, outlines them and draws colored arrows across their Feret’s width with the arrowhead pointing to the thin end of the hair and with a color assigned correlating with the Feret’s angle (calculated over 360 degrees).

I’d like to overlay these arrow on the original image. It works well with a simpler macro making all the arrows are black or all are white, but when I used the colored arrows macro, the overlay is converted to green. Any idea why?

It would be very helpful if you could provide a small, self-contained macro that reproduces the problem. The following macro works as expected. It requires the latest ImageJ daily build (1.51j9), which adds the Roi.setStrokeColor(r,g,b) macro function.

-wayne

 requires("1.51j");
 newImage("Untitled", "8-bit black", 720, 576, 1);  makeArrow(337, 85, 205, 212, "notched large");  Roi.setStrokeWidth(3);  Roi.setStrokeColor(255, 200, 100);  run("Add Selection...");  makeArrow(50, 130, 185, 213, "notched large");  Roi.setStrokeWidth(3);  Roi.setStrokeColor(255, 0, 0);  run("Add Selection...");  makeArrow(201, 435, 195, 240, "notched large");  Roi.setStrokeWidth(3);  Roi.setStrokeColor(50, 100, 255);  run("Add Selection...");  Overlay.copy;  wait(2000);  close;  run("Boats (356K)");  Overlay.paste;


Here’s the very end of the macro (whole macro below)

for (i=0; i<nResults; i++) {
  r = getResult("R",i);
  g = getResult("G",i);
  b = getResult("B",i);
xh = getResult("xh",i);
xt = getResult("xt",i);
yh = getResult("yh",i);
yt = getResult("yt",i);

run("Draw", "slice");
    setTool("arrow");
    run("Color Picker...");
setForegroundColor(r, g, b);
    makeArrow(xt, yt, xh, yh, "notched"); Roi.setStrokeWidth(width); Overlay.addSelection(); Overlay.copy; } run("Close"); open(path_name); run("Color Picker..."); setForegroundColor(r, g, b); Overlay.paste;

/////////////////////////////////////////

Here’s the whole macro

var path_name = getDirectory("image")+ getInfo("image.filename");

run("Revert");


setAutoThreshold("Default");
run("Set Measurements...", "centroid center feret's redirect=None decimal=3"); run("Analyze Particles...", "  show=[Overlay Outlines] display exclude clear"); run("To ROI Manager"); roiManager("Show All without labels");

title = "Untitled";
width=512; height=512;
Dialog.create("Set Arrow");
Dialog.addNumber("Width:", 51);
Dialog.show();
width = Dialog.getNumber();

resetThreshold();
Overlay.drawLabels(false);

for (i=0; i<nResults; i++) {
   x11 = getResult("FeretX",i);
   y11 = getResult("FeretY",i);
   length = getResult("Feret",i);
   degrees = getResult("FeretAngle",i);
   if (degrees>90)
      degrees -= 180;
   angle = degrees*PI/180;
   x21 = x11 + cos(angle)*length;
   setResult("x21", i, x21);
   y21 = y11 - sin(angle)*length;
   setResult("y21", i, y21);

   x31 = getResult("X",i);
   y31 = getResult("Y",i);

   makeLine(x31, y31, x11, y11);
   getPixelSize(unit, pw, ph);
   dz = (x31 - x11)*pw;
   da = (y31 - y11)*ph;
   distance1 = sqrt(dz*dz + da*da);
   setResult("D1", i, distance1);
   updateResults;


makeLine(x31, y31, x21, y21);
   getPixelSize(unit, pw, ph);
   dx = (x31 - x21)*pw;
   dy = (y31 - y21)*ph;
   distance2 = sqrt(dx*dx + dy*dy);
   setResult("D2", i, distance2);
   updateResults;

}

for (i=0; i<nResults; i++) {

   D1 = getResult("D1",i);
   D2 = getResult("D2",i);
   x11 = getResult("FeretX",i);
   y11 = getResult("FeretY",i);
   x21 = getResult("x21",i);
   y21 = getResult("y21",i);

   if (D1 > D2) {
    setResult("xh", i, x11);
setResult("xt", i, x21);
setResult("yh", i, y11);
setResult("yt", i, y21);
updateResults;setTool("arrow");

 } else {

setResult("xh", i, x21);
setResult("xt", i, x11);
setResult("yh", i, y21);
setResult("yt", i, y11);
}
}

for (i=0; i<nResults; i++) {
xh = getResult("xh",i);
xt = getResult("xt",i);
yh = getResult("yh",i);
yt = getResult("yt",i);
degrees = getResult("FeretAngle",i);


if (xh > xt && yh < yt){
angle2 = degrees + 180;
setResult("angle360", i, angle2);
updateResults;
}

if (xh < xt && yh > yt){
angle2 = degrees + 0;
setResult("angle360", i, angle2);
updateResults;
}

if (xh > xt && yh > yt){
angle2 = degrees + 0;
setResult("angle360", i, angle2);
updateResults;
}

if (xh < xt && yh < yt){
angle2 = degrees + 180;
setResult("angle360", i, angle2);
}
}
run("RGB Color");

for (i=0; i<nResults; i++) {
a = getResult("angle360",i);

if (0 < a && a < 60){
r = 255;
g = 4.25*a;
b = 0;
setResult("R", i, r);
setResult("G", i, g);
setResult("B", i, b);
updateResults;
}

if (61 < a && a < 120){
r = -4.25*a + 510;
g = 255;
b = 0;
setResult("R", i, r);
setResult("G", i, g);
setResult("B", i, b);
updateResults;
}
if (121 < a && a< 180){
r = 0;
g = 255;
b = 4.25*a - 510;
setResult("R", i, r);
setResult("G", i, g);
setResult("B", i, b);
updateResults;
}
if (181 < a && a < 240){
r = 0;
g = -4.25*a + 1020;
b = 255;
setResult("R", i, r);
setResult("G", i, g);
setResult("B", i, b);
updateResults;
}
if (241 < a && a < 300){
r = 4.25*a - 1020;
g = 0;
b = 255;
setResult("R", i, r);
setResult("G", i, g);
setResult("B", i, b);
updateResults;
}
if (301 < a && a < 360){
r = 255;
g = 0;
b = -4.25*a + 1530;
setResult("R", i, r);
setResult("G", i, g);
setResult("B", i, b);
updateResults;
}
}

for (i=0; i<nResults; i++) {
  r = getResult("R",i);
  g = getResult("G",i);
  b = getResult("B",i);
xh = getResult("xh",i);
xt = getResult("xt",i);
yh = getResult("yh",i);
yt = getResult("yt",i);

run("Draw", "slice");
    setTool("arrow");
    run("Color Picker...");
setForegroundColor(r, g, b);
    makeArrow(xt, yt, xh, yh, "notched"); Roi.setStrokeWidth(width); Overlay.addSelection(); Overlay.copy; } run("Close"); open(path_name); run("Color Picker..."); setForegroundColor(r, g, b); Overlay.paste;



Len Dobens


Leonard Dobens, PhD
Professor of Molecular Biology and Biochemistry
SCB312
School of Biological Sciences
University of Missouri-Kansas City
5007 Rockhill Road
Kansas City, MO 64110
8162356272
[hidden email]<mailto:[hidden email]><mailto:[hidden email]>




--
ImageJ mailing list: http://imagej.nih.gov/ij/list.html


--
ImageJ mailing list: http://imagej.nih.gov/ij/list.html

Leonard Dobens, PhD
Professor of Molecular Biology and Biochemistry
SCB312
School of Biological Sciences
University of Missouri-Kansas City
5007 Rockhill Road
Kansas City, MO 64110
8162356272
[hidden email]<mailto:[hidden email]>




--
ImageJ mailing list: http://imagej.nih.gov/ij/list.html

--
ImageJ mailing list: http://imagej.nih.gov/ij/list.html
Reply | Threaded
Open this post in threaded view
|

Re: overlays

dobensl
That did the trick and my own macro magically starts working perfectly as well. Thanks so much everybody!

Len Dobens


On Jan 5, 2017, at 3:22 AM, Philippe CARL <[hidden email]<mailto:[hidden email]>> wrote:

Dear Len,
If you do "Help->Update_ImageJ..." and from there you choose the "daily build" version you will end up with the version v1.51j9.
And I tried the macro Wayne sent you on this daily build version and it is working as a charm.
And the same macro is not working properly if you stay within the version 1.51i.
My best regards,
Philippe

-----Message d'origine-----
De : ImageJ Interest Group [mailto:[hidden email]] De la part de Dobens, Leonard
Envoyé : jeudi 5 janvier 2017 01:33
À : [hidden email]<mailto:[hidden email]>
Objet : Re: overlays

A couple of problems in running your macro. The 1.51j version is not available, only 1.51i. Also when I do run your macro in “i” version, the command "Roi.setStrokeColor(255, 0, 0);” is not happy with RGB values - appears that only hex numbers are allowed (Does the “j” version permit RGB? that could address my problems).

I recognized that Roi.setStrokeColor() arrows drawn manually and colored by a hex value could be overplayed properly and I have tried to put together a hex converter for my RGB values, and while that change in the macro effectively removes the green arrows, the colors are now black with a couple of blue arrows, so my hex converter (as written) is not good.

The “green arrows” that come from the macro code cited below:
  run("Color Picker...");
setForegroundColor(r, g, b);
   makeArrow(xt, yt, xh, yh, "notched"); Roi.setStrokeWidth(width); Overlay.addSelection(); Overlay.copy; may result from a "select arrow” appearance (green), that if I could “de-select” all, may reveal their underlying proper color

Len



On Jan 3, 2017, at 10:17 PM, Rasband, Wayne (NIH/NIMH) [E] <[hidden email]<mailto:[hidden email]><mailto:[hidden email]>> wrote:


On Jan 3, 2017, at 5:36 PM, Dobens, Leonard <[hidden email]<mailto:[hidden email]><mailto:[hidden email]>> wrote:

I’ve written a macro that identifies hairs in a photomicrograph, outlines them and draws colored arrows across their Feret’s width with the arrowhead pointing to the thin end of the hair and with a color assigned correlating with the Feret’s angle (calculated over 360 degrees).

I’d like to overlay these arrow on the original image. It works well with a simpler macro making all the arrows are black or all are white, but when I used the colored arrows macro, the overlay is converted to green. Any idea why?

It would be very helpful if you could provide a small, self-contained macro that reproduces the problem. The following macro works as expected. It requires the latest ImageJ daily build (1.51j9), which adds the Roi.setStrokeColor(r,g,b) macro function.

-wayne

requires("1.51j");
newImage("Untitled", "8-bit black", 720, 576, 1);  makeArrow(337, 85, 205, 212, "notched large");  Roi.setStrokeWidth(3);  Roi.setStrokeColor(255, 200, 100);  run("Add Selection...");  makeArrow(50, 130, 185, 213, "notched large");  Roi.setStrokeWidth(3);  Roi.setStrokeColor(255, 0, 0);  run("Add Selection...");  makeArrow(201, 435, 195, 240, "notched large");  Roi.setStrokeWidth(3);  Roi.setStrokeColor(50, 100, 255);  run("Add Selection...");  Overlay.copy;  wait(2000);  close;  run("Boats (356K)");  Overlay.paste;


Here’s the very end of the macro (whole macro below)

for (i=0; i<nResults; i++) {
 r = getResult("R",i);
 g = getResult("G",i);
 b = getResult("B",i);
xh = getResult("xh",i);
xt = getResult("xt",i);
yh = getResult("yh",i);
yt = getResult("yt",i);

run("Draw", "slice");
   setTool("arrow");
   run("Color Picker...");
setForegroundColor(r, g, b);
   makeArrow(xt, yt, xh, yh, "notched"); Roi.setStrokeWidth(width); Overlay.addSelection(); Overlay.copy; } run("Close"); open(path_name); run("Color Picker..."); setForegroundColor(r, g, b); Overlay.paste;

/////////////////////////////////////////

Here’s the whole macro

var path_name = getDirectory("image")+ getInfo("image.filename");

run("Revert");


setAutoThreshold("Default");
run("Set Measurements...", "centroid center feret's redirect=None decimal=3"); run("Analyze Particles...", "  show=[Overlay Outlines] display exclude clear"); run("To ROI Manager"); roiManager("Show All without labels");

title = "Untitled";
width=512; height=512;
Dialog.create("Set Arrow");
Dialog.addNumber("Width:", 51);
Dialog.show();
width = Dialog.getNumber();

resetThreshold();
Overlay.drawLabels(false);

for (i=0; i<nResults; i++) {
  x11 = getResult("FeretX",i);
  y11 = getResult("FeretY",i);
  length = getResult("Feret",i);
  degrees = getResult("FeretAngle",i);
  if (degrees>90)
     degrees -= 180;
  angle = degrees*PI/180;
  x21 = x11 + cos(angle)*length;
  setResult("x21", i, x21);
  y21 = y11 - sin(angle)*length;
  setResult("y21", i, y21);

  x31 = getResult("X",i);
  y31 = getResult("Y",i);

  makeLine(x31, y31, x11, y11);
  getPixelSize(unit, pw, ph);
  dz = (x31 - x11)*pw;
  da = (y31 - y11)*ph;
  distance1 = sqrt(dz*dz + da*da);
  setResult("D1", i, distance1);
  updateResults;


makeLine(x31, y31, x21, y21);
  getPixelSize(unit, pw, ph);
  dx = (x31 - x21)*pw;
  dy = (y31 - y21)*ph;
  distance2 = sqrt(dx*dx + dy*dy);
  setResult("D2", i, distance2);
  updateResults;

}

for (i=0; i<nResults; i++) {

  D1 = getResult("D1",i);
  D2 = getResult("D2",i);
  x11 = getResult("FeretX",i);
  y11 = getResult("FeretY",i);
  x21 = getResult("x21",i);
  y21 = getResult("y21",i);

  if (D1 > D2) {
   setResult("xh", i, x11);
setResult("xt", i, x21);
setResult("yh", i, y11);
setResult("yt", i, y21);
updateResults;setTool("arrow");

} else {

setResult("xh", i, x21);
setResult("xt", i, x11);
setResult("yh", i, y21);
setResult("yt", i, y11);
}
}

for (i=0; i<nResults; i++) {
xh = getResult("xh",i);
xt = getResult("xt",i);
yh = getResult("yh",i);
yt = getResult("yt",i);
degrees = getResult("FeretAngle",i);


if (xh > xt && yh < yt){
angle2 = degrees + 180;
setResult("angle360", i, angle2);
updateResults;
}

if (xh < xt && yh > yt){
angle2 = degrees + 0;
setResult("angle360", i, angle2);
updateResults;
}

if (xh > xt && yh > yt){
angle2 = degrees + 0;
setResult("angle360", i, angle2);
updateResults;
}

if (xh < xt && yh < yt){
angle2 = degrees + 180;
setResult("angle360", i, angle2);
}
}
run("RGB Color");

for (i=0; i<nResults; i++) {
a = getResult("angle360",i);

if (0 < a && a < 60){
r = 255;
g = 4.25*a;
b = 0;
setResult("R", i, r);
setResult("G", i, g);
setResult("B", i, b);
updateResults;
}

if (61 < a && a < 120){
r = -4.25*a + 510;
g = 255;
b = 0;
setResult("R", i, r);
setResult("G", i, g);
setResult("B", i, b);
updateResults;
}
if (121 < a && a< 180){
r = 0;
g = 255;
b = 4.25*a - 510;
setResult("R", i, r);
setResult("G", i, g);
setResult("B", i, b);
updateResults;
}
if (181 < a && a < 240){
r = 0;
g = -4.25*a + 1020;
b = 255;
setResult("R", i, r);
setResult("G", i, g);
setResult("B", i, b);
updateResults;
}
if (241 < a && a < 300){
r = 4.25*a - 1020;
g = 0;
b = 255;
setResult("R", i, r);
setResult("G", i, g);
setResult("B", i, b);
updateResults;
}
if (301 < a && a < 360){
r = 255;
g = 0;
b = -4.25*a + 1530;
setResult("R", i, r);
setResult("G", i, g);
setResult("B", i, b);
updateResults;
}
}

for (i=0; i<nResults; i++) {
 r = getResult("R",i);
 g = getResult("G",i);
 b = getResult("B",i);
xh = getResult("xh",i);
xt = getResult("xt",i);
yh = getResult("yh",i);
yt = getResult("yt",i);

run("Draw", "slice");
   setTool("arrow");
   run("Color Picker...");
setForegroundColor(r, g, b);
   makeArrow(xt, yt, xh, yh, "notched"); Roi.setStrokeWidth(width); Overlay.addSelection(); Overlay.copy; } run("Close"); open(path_name); run("Color Picker..."); setForegroundColor(r, g, b); Overlay.paste;



Len Dobens


Leonard Dobens, PhD
Professor of Molecular Biology and Biochemistry
SCB312
School of Biological Sciences
University of Missouri-Kansas City
5007 Rockhill Road
Kansas City, MO 64110
8162356272
[hidden email]<mailto:[hidden email]><mailto:[hidden email]><mailto:[hidden email]>




--
ImageJ mailing list: http://imagej.nih.gov/ij/list.html


--
ImageJ mailing list: http://imagej.nih.gov/ij/list.html

Leonard Dobens, PhD
Professor of Molecular Biology and Biochemistry
SCB312
School of Biological Sciences
University of Missouri-Kansas City
5007 Rockhill Road
Kansas City, MO 64110
8162356272
[hidden email]<mailto:[hidden email]><mailto:[hidden email]>




--
ImageJ mailing list: http://imagej.nih.gov/ij/list.html

--
ImageJ mailing list: http://imagej.nih.gov/ij/list.html

Leonard Dobens, PhD
Professor of Molecular Biology and Biochemistry
SCB312
School of Biological Sciences
University of Missouri-Kansas City
5007 Rockhill Road
Kansas City, MO 64110
8162356272
[hidden email]<mailto:[hidden email]>




--
ImageJ mailing list: http://imagej.nih.gov/ij/list.html