Login  Register

Re: Use Rank() - rankFloat() (RankFilters) in a plugin.

Posted by Wayne Rasband on Feb 05, 2009; 5:34pm
URL: http://imagej.273.s1.nabble.com/Use-Rank-rankFloat-RankFilters-in-a-plugin-tp3693843p3693845.html

On Feb 5, 2009, at 10:37 AM, joris meys wrote:

> Thank you very much. Tried it, but I seem not to be able to get it run
> on
> the right image. it should run on the image processor ip2 in the code,
> but
> it destructively changes the first slice in the original stack. Any
> way of
> getting around that one?

  IJ.run("Median...","radius="+radius) runs on the current slice of the
current stack. You can call the rank() method of the RankFilters class
to median filter an ImageProcessor. Here is a JavaScript example:

   importClass(Packages.ij.plugin.filter.RankFilters)
   img = IJ.getImage();
   ip = img.getProcessor();
   filter = new RankFilters();
   radius = 3;
   filter.rank(ip, radius, RankFilters.MEDIAN);
   img.updateAndDraw();
   IJ.showProgress(1);

-wayne


>
> Kind regards
> Joris
>
> Code :
> public static ImageProcessor getDeriche(ImageProcessor ip, float alpha,
> double radius){
>         int type = getType(ip);
>         if (type==OTHER){
>             IJ.showMessage("Deriche works only on greyscale or
> pseudocolored
> images");
>             return null;
>         }
>         ArrayList<double[]> arrays = null;
>         ImageProcessor ip2= ip.duplicate();
>         //if (radius > 0)ip2 = applyMedian(ip2, radius); // to the
> function
> I copied from rankFloat.
>         if (radius>0)IJ.run("Median...","radius="+radius);
>
>         arrays = dericheCalc(ip2,alpha); // self-defined function
>         double[] norm = arrays.get(0);
>         double[] angle = arrays.get(1);
>         FloatProcessor normfp = new FloatProcessor(ip2.getWidth(),
> ip2.getHeight(), norm);
>         normfp.resetMinAndMax();
>         FloatProcessor anglefp = new FloatProcessor(ip2.getWidth(),
> ip2.getHeight(), angle);
>         anglefp.resetMinAndMax();
>         ip2 = nonMaximalSuppression(normfp, anglefp);
>         return ip2;
>     }
>
>
>
> On Thu, Feb 5, 2009 at 3:53 PM, Wayne Rasband <[hidden email]> wrote:
>
>> Dear Joris,
>>
>> On Feb 5, 2009, at 6:48 AM, joris meys wrote:
>>
>>  Dear all,
>>>
>>> I'm writing (yet another) plugin for edge detection, and i want to
>>> apply
>>> the
>>> median filter, but not with a 3x3 kernel but with a circular mask. I
>>> know
>>> I
>>> can run the command with IJ.doCommand("Median"), but when I try that
>>> (or
>>> IJ.run), I get the message "image locked". with
>>> IJ.RunPlugIn("Median",null),
>>> I get simply nothing.
>>>
>>
>> You can avoid the "image locked" error by changing your plugin so
>> that it
>> implements the PlugIn interface instead of PlugInFiler and run the
>> median
>> filter using
>>
>>    run("Median...", "radius=1");
>>
>> -wayne
>>
>>
>>
>>> Plus, I don't want the image filter to open, I just want to apply the
>>> method
>>> rankFloat to my imageprocessor with a fixed radius. I tried
>>> accessing the
>>> method, but got (off course) the static/nonstatic error. Tried to
>>> instantize
>>> RankFilters and do it that way, but that didn't want to work either.
>>> Right
>>> now, I copied the code of rankFloat() and adjusted it for my own
>>> use. It
>>> works, but it's not really elegant to say at least.
>>>
>>> Anybody who knows to do this right?
>>> Kind regards
>>> Joris
>>>
>>>
>>
>