unit filterGradientAnisotropicDiffusion;
(* ***** BEGIN LICENSE BLOCK *****
* Copyright (C) 2004 Durand Emmanuel
* Copyright (C) 2004 Burgel Eric
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Contact :
* filters@edurand.com
* filters@burgel.com
*
* ***** END LICENSE BLOCK ***** *)
{
edurand (filters@edurand.com)
}
{
use 'Itk' implementation
}
interface
uses
filter, fparameters, image, filterBlur, filterCopy;
type
TFilterGradientAnisotropicDiffusion = class(TFilter)
public
constructor Create; override;
destructor Destroy; override;
procedure Run(); override;
private
parameterImageIn, parameterImageOut : TParameterImage;
parameterConductance : TParameterSingle;
parameterIteration : TParameterInteger;
parameterMethod : TParameterString;
filterBlur : TFilterBlur;
filterCopy : TFilterCopy;
imageBlurIn : PBitmap32;
imageIn, imageOut : PBitmap32;
procedure _run();
end;
implementation
uses
imageIO, wrapper_itk, math;
constructor TFilterGradientAnisotropicDiffusion.Create;
begin
inherited;
parameterImageIn:=addParameterImage('inImage', 'input image');
parameterImageOut:=addParameterImage('outImage', 'result image');
parameterConductance := addParameterSingle('conductance', 'conductance', 0, 100, 3);
parameterIteration := addParameterInteger('iteration', 'iteration', 1, 10, 1);
parameterMethod := addParameterString('method','method to use : [FAST_BLUR_ANISOTROPIC/STANDARD_GREY_LEVEL/STANDARD_RGB]', 'FAST_BLUR_ANISOTROPIC');
filterBlur:=TFilterBlur.Create;
filterCopy:=TFilterCopy.Create;
end;
destructor TFilterGradientAnisotropicDiffusion.Destroy;
begin
inherited;
image.freeImage(imageBlurIn);
filterCopy.Free;
filterBlur.Free;
end;
procedure TFilterGradientAnisotropicDiffusion.Run();
begin
imageIn:=parameterImageIn.Image;
imageOut:=parameterImageOut.Image;
if (imageIn<>nil) and (imageOut<>nil) then begin
_run();
end;
end;
procedure TFilterGradientAnisotropicDiffusion._run();
var
method : Integer;
iteration : Integer;
conductance : Single;
i : Integer;
begin
iteration:=parameterIteration.Value;
conductance:=parameterConductance.Value;
method:=0;
if parameterMethod.Value='STANDARD_GREY_LEVEL' then method:=1
else if parameterMethod.Value='STANDARD_RGB' then method:=2;
if method=0 then begin
// fast blur anisotropic
imageBlurIn:=image.eraseOrCreateImageLike(imageBlurIn,imageIn);
image.copyImageToImage(imageIn,imageBlurIn);
filterBlur.setParameterImage('outImage',imageOut);
filterBlur.setParameterInteger('mode', 1);
filterBlur.setParameterInteger('radius',Floor(conductance));
i:=iteration;
while i>0 do begin
filterBlur.setParameterImage('inImage',imageBlurIn);
filterBlur.Run;
Dec(i);
if i>0 then begin
image.copyImageToImage(imageOut,imageBlurIn);
end;
end;
end else begin
// standard
wrapper_itk.filterItkGradientAnisotropicDiffusion(
imageIn, imageOut,
conductance,
iteration,
method
);
end;
end;
end.