YUV thresholding in a macro

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

YUV thresholding in a macro

asuspeg
Hello everyone,

I'm using imageJ to determine the %area of cells (microalgae) on a substrate (platic microplates) to follow the developement of the microalgae day after day.

So, I take photos of my cultures day after day and use the "Color Threshold" tool for thresholding my pictures in terms of colour saturation (my cells are yellow and the background is black). For that, I use the YUV color space and after selecting "dark background", I adjust the "U" value at 100. After that, I simply use the "Analyze particles" tool to extract the %area value of the cells.

It works very well but I have something like 100 photos to treat per day, and it will increase in the next weeks... That's why I would like to automatize the treatment by using a Macro.

So, I use the tool "Record..." and do my manipulations (I click on "Macro" button in the "Color Threshold" window after seting up the parameters cited above), save the macro and install it.

Unfortunately, the macro doesn't work, even with just one picture: it blocks at the Color Threshold step by doing a HSB threshold with default parameters, and few seconds after, closes the picture with the message "There are no image open".

I don't know what's the problem... but I think it's the same problem than described in a previous post: http://imagej.1557.x6.nabble.com/unconsistency-while-using-YUV-color-threshold-in-macro-td5003443.html

Thank you for your help !

Here is an example of 2 pictures I use: https://www.dropbox.com/sh/qiueaj5n7wk3xkm/AACslOuyjMZddDfRDorgEcUla?dl=0

Here is my macro:

run("Color Threshold...");
// Color Thresholder 1.49v
// Autogenerated macro, single images only!
min=newArray(3);
max=newArray(3);
filter=newArray(3);
a=getTitle();
call("ij.plugin.frame.ColorThresholder.RGBtoYUV");
run("RGB Stack");
run("Convert Stack to Images");
selectWindow("Red");
rename("0");
selectWindow("Green");
rename("1");
selectWindow("Blue");
rename("2");
min[0]=0;
max[0]=255;
filter[0]="pass";
min[1]=0;
max[1]=100;
filter[1]="pass";
min[2]=0;
max[2]=255;
filter[2]="pass";
for (i=0;i<3;i++){
  selectWindow(""+i);
  setThreshold(min[i], max[i]);
  run("Convert to Mask");
  if (filter[i]=="stop")  run("Invert");
}
imageCalculator("AND create", "0","1");
imageCalculator("AND create", "Result of 0","2");
for (i=0;i<3;i++){
  selectWindow(""+i);
  close();
}
selectWindow("Result of 0");
close();
selectWindow("Result of Result of 0");
rename(a);
// Colour Thresholding-------------
run("Analyze Particles...", "size=500-Infinity display summarize");
Reply | Threaded
Open this post in threaded view
|

Re: YUV thresholding in a macro

Stefan Helfrich-2
Hi Steven,

are your "100 photos to treat per day" of the same specimen over time?
If so, you should open them in a stack (via File > Import > Image
Sequence) and take care that the properties (Image > Properties...) are
set correctly (slice=1, frames > 1). This is a requirement for the macro
that I am proposing at the end of the mail.

The macro applies the auto-generated part from the Color Thresholder to
each slice of a stack and applies the Analyze Particles command that you
had provided in your mail. You can change the first line of the macro to
adapt the U threshold that is applied to the images.

All the best,
Stefan

uThreshold = 100;

// Hides intermediate images
setBatchMode(true);

// Color Thresholder 1.49v
// Autogenerated macro, single images only!
min=newArray(3);
max=newArray(3);
filter=newArray(3);

Stack.getDimensions(width, height, channels, slices, frames);
originalTitle = getTitle();
originalId = getImageID();

// Apply the auto-generated macro to each slice of an image
for (j=1; j<=frames; j++) {
      selectImage(originalId);

      setSlice(j);
      run("Duplicate...", " ");
      duplicateId = getImageID();

      a=getTitle();
      call("ij.plugin.frame.ColorThresholder.RGBtoYUV");
      run("RGB Stack");
      run("Convert Stack to Images");
      selectWindow("Red");
      rename("0");
      selectWindow("Green");
      rename("1");
      selectWindow("Blue");
      rename("2");
      min[0]=0;
      max[0]=255;
      filter[0]="pass";
      min[1]=0;
      max[1]=uThreshold;
      filter[1]="pass";
      min[2]=0;
      max[2]=255;
      filter[2]="pass";
      for (i=0;i<3;i++){
        selectWindow(""+i);
        setThreshold(min[i], max[i]);
        run("Convert to Mask");
        if (filter[i]=="stop")  run("Invert");
      }
      imageCalculator("AND create", "0","1");
      imageCalculator("AND create", "Result of 0","2");
      for (i=0;i<3;i++){
        selectWindow(""+i);
        close();
      }
      selectWindow("Result of 0");
      close();
      selectWindow("Result of Result of 0");
      rename("thresholded-"+j);
      // Colour Thresholding-------------

      run("Analyze Particles...", "size=500-Infinity display summarize");
}

run("Images to Stack", "name="+originalTitle+"-thresholded
title=thresholded use");
selectWindow(originalTitle+"-thresholded");

setBatchMode(false);

On 3/9/16 1:40 PM, asuspeg wrote:

> Hello everyone,
>
> I'm using imageJ to determine the %area of cells (microalgae) on a substrate
> (platic microplates) to follow the developement of the microalgae day after
> day.
>
> So, I take photos of my cultures day after day and use the "Color Threshold"
> tool for thresholding my pictures in terms of colour saturation (my cells
> are yellow and the background is black). For that, I use the YUV color space
> and after selecting "dark background", I adjust the "U" value at 100. After
> that, I simply use the "Analyze particles" tool to extract the %area value
> of the cells.
>
> It works very well but I have something like 100 photos to treat per day,
> and it will increase in the next weeks... That's why I would like to
> automatize the treatment by using a Macro.
>
> So, I use the tool "Record..." and do my manipulations (I click on "Macro"
> button in the "Color Threshold" window after seting up the parameters cited
> above), save the macro and install it.
>
> Unfortunately, the macro doesn't work, even with just one picture: it blocks
> at the Color Threshold step by doing a HSB threshold with default
> parameters, and few seconds after, closes the picture with the message
> "There are no image open".
>
> I don't know what's the problem... but I think it's the same problem than
> described in a previous post:
> http://imagej.1557.x6.nabble.com/unconsistency-while-using-YUV-color-threshold-in-macro-td5003443.html
>
> Thank you for your help !
>
> Here is an example of 2 pictures I use:
> https://www.dropbox.com/sh/qiueaj5n7wk3xkm/AACslOuyjMZddDfRDorgEcUla?dl=0
>
> Here is my macro:
>
> run("Color Threshold...");
> // Color Thresholder 1.49v
> // Autogenerated macro, single images only!
> min=newArray(3);
> max=newArray(3);
> filter=newArray(3);
> a=getTitle();
> call("ij.plugin.frame.ColorThresholder.RGBtoYUV");
> run("RGB Stack");
> run("Convert Stack to Images");
> selectWindow("Red");
> rename("0");
> selectWindow("Green");
> rename("1");
> selectWindow("Blue");
> rename("2");
> min[0]=0;
> max[0]=255;
> filter[0]="pass";
> min[1]=0;
> max[1]=100;
> filter[1]="pass";
> min[2]=0;
> max[2]=255;
> filter[2]="pass";
> for (i=0;i<3;i++){
>    selectWindow(""+i);
>    setThreshold(min[i], max[i]);
>    run("Convert to Mask");
>    if (filter[i]=="stop")  run("Invert");
> }
> imageCalculator("AND create", "0","1");
> imageCalculator("AND create", "Result of 0","2");
> for (i=0;i<3;i++){
>    selectWindow(""+i);
>    close();
> }
> selectWindow("Result of 0");
> close();
> selectWindow("Result of Result of 0");
> rename(a);
> // Colour Thresholding-------------
> run("Analyze Particles...", "size=500-Infinity display summarize");
>
>
>
> --
> View this message in context: http://imagej.1557.x6.nabble.com/YUV-thresholding-in-a-macro-tp5015832.html
> Sent from the ImageJ mailing list archive at Nabble.com.
>
> --
> ImageJ mailing list: http://imagej.nih.gov/ij/list.html

--
Stefan Helfrich, M.Sc.
Bioimaging Center (L931)
University of Konstanz

PO Box 604
78457 Konstanz
Germany

Tel +49-7531-884666
Fax +49-7531-884005

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

Re: YUV thresholding in a macro

asuspeg
Hi Stefan,

Thank you very much for your answer.

Unfortunately, the specimens I follow are not the same... So after posting my message, I have continued to search for solutions and I found something easier :

There is no other color in my photos apart of my cells, so I just did a threshold by saturation : with "color threshold", I simply set up the "saturation" to a fixed value and take all the "hue" and "brightness" spectre. And it works very well !

So thank you anyway for your macro, maybe it will help me for following future cultures.

I post my macro if someone is intrested :

run("Color Threshold...");
// Color Thresholder 1.49v
// Autogenerated macro, single images only!
min=newArray(3);
max=newArray(3);
filter=newArray(3);
a=getTitle();
run("HSB Stack");
run("Convert Stack to Images");
selectWindow("Hue");
rename("0");
selectWindow("Saturation");
rename("1");
selectWindow("Brightness");
rename("2");
min[0]=0;
max[0]=255;
filter[0]="pass";
min[1]=100;
max[1]=255;
filter[1]="pass";
min[2]=0;
max[2]=255;
filter[2]="pass";
for (i=0;i<3;i++){
  selectWindow(""+i);
  setThreshold(min[i], max[i]);
  run("Convert to Mask");
  if (filter[i]=="stop")  run("Invert");
}
imageCalculator("AND create", "0","1");
imageCalculator("AND create", "Result of 0","2");
for (i=0;i<3;i++){
  selectWindow(""+i);
  close();
}
selectWindow("Result of 0");
close();
selectWindow("Result of Result of 0");
rename(a);
// Colour Thresholding-------------
run("Analyze Particles...", "size=500-Infinity summarize");