<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<META NAME="Generator" CONTENT="MS Exchange Server version 6.5.7654.12">
<TITLE>RE: [Insight-users] Problem implementing GradientAnisotropicDiffusionImageFilter</TITLE>
</HEAD>
<BODY>
<!-- Converted from text/plain format -->

<P><FONT SIZE=2>Hi Bill,<BR>
&nbsp;&nbsp;&nbsp; I use the exact same file with ITK (the one attached to the previous email with MATLAB code).<BR>
<BR>
Regards,<BR>
&nbsp;&nbsp; Michael<BR>
<BR>
<BR>
-----Original Message-----<BR>
From: Bill Lorensen [<A HREF="mailto:bill.lorensen@gmail.com">mailto:bill.lorensen@gmail.com</A>]<BR>
Sent: Tue 12/1/2009 4:17 PM<BR>
To: O'Connor, Michael<BR>
Cc: insight-users@itk.org<BR>
Subject: Re: [Insight-users] Problem implementing GradientAnisotropicDiffusionImageFilter<BR>
<BR>
Can you provide a png file or meta file, or whatever file you tried with itk?<BR>
<BR>
On Tue, Dec 1, 2009 at 4:08 PM, O'Connor, Michael<BR>
&lt;Michael.OConnor@umassmed.edu&gt; wrote:<BR>
&gt; Hi Bill,<BR>
&gt;     Thanks.   Attached is simple MATLAB test code  + the MATLAB filter<BR>
&gt; function used (Dr. Guy Gilboa's code).   I've also take the liberty of<BR>
&gt; attaching a test image (specifically opened in MATLAB code).   The test<BR>
&gt; image is 400x400 float with background = 0.024 + additive Gaussian Noise and<BR>
&gt; foreground (circle) = 0.031 + additive Gaussian Noise.   As said previously<BR>
&gt; MATLAB code seems to work as expected as shown in plot.   In ITK there is no<BR>
&gt; similar intraregion filtering (i.e. filtered image ~ input )<BR>
&gt;<BR>
&gt; Regards,<BR>
&gt;    Michael<BR>
&gt;<BR>
&gt; ******<BR>
&gt; %%% simple test of anisotropic diffusion filter<BR>
&gt; %%% uses Guy Gilboa's  diffusion function (from his website)<BR>
&gt; %%%<BR>
&gt; clear all;<BR>
&gt; close all;<BR>
&gt; close all hidden;<BR>
&gt; row = 400;<BR>
&gt; col = 400;<BR>
&gt; GAIN = 1;<BR>
&gt; iter = 5;<BR>
&gt; conductance = 0.003 * GAIN;<BR>
&gt; timestep = 0.125;<BR>
&gt;<BR>
&gt;<BR>
&gt; %%<BR>
&gt; fid_raw = fopen('/Users/michaeloconnor/Desktop/phantom_ADF3.rec','r');<BR>
&gt;<BR>
&gt; if (fid_raw == -1 )<BR>
&gt;     fprintf('NO Input File(s) in Working Directory \n');<BR>
&gt;     break;                                  %stop now - invalid file<BR>
&gt; end<BR>
&gt; %%<BR>
&gt;<BR>
&gt; fprintf('iterations = %i timestep = %4.3f  conductance = %f Gain = %i<BR>
&gt; \n',iter,timestep,conductance, GAIN)<BR>
&gt;<BR>
&gt; read_raw= fread(fid_raw, [row col],'single');<BR>
&gt; I=read_raw*GAIN;<BR>
&gt;<BR>
&gt; J_adf=diffusion2(I, 'pm1', iter,  conductance, timestep);<BR>
&gt;<BR>
&gt; %% Display Both input and Filtered Using Image Processing Toolkit<BR>
&gt;<BR>
&gt; imtool(J_adf, [])<BR>
&gt; imtool(I, [])<BR>
&gt;<BR>
&gt; %% Plot 1D Profile<BR>
&gt;<BR>
&gt; p=plot([1:400],I(200,:),[1:400],J_adf(200,:));<BR>
&gt; set(p,'LineWidth',2);<BR>
&gt; title('1D Profile (row 200)','FontSize',14, 'FontWeight', 'bold');<BR>
&gt; xlabel('Column (1:400)','FontSize',14, 'FontWeight', 'bold')<BR>
&gt; ylabel('MU Value','FontSize',14, 'FontWeight', 'bold')<BR>
&gt; legend('Pre-Filter', 'ADF Filter')<BR>
&gt; fclose all;<BR>
&gt;<BR>
&gt; ******* filter function (Dr. Gilboa's code)<BR>
&gt; function Jd = diffusion2(J,method,N,K,dt,theta,sigma2)<BR>
&gt; % private function: diffusion (by Guy Gilboa):<BR>
&gt; % Jd=diffusion(J,method,N,K)<BR>
&gt; % Simulates N iterations of diffusion, parameters:<BR>
&gt; % J =  source image (2D gray-level matrix) for diffusio<BR>
&gt; % method =  'lin':  Linear diffusion (constant c=1).<BR>
&gt; %           'pm1': perona-malik, c=exp{-(|grad(J)|/K)^2} [PM90]<BR>
&gt; %           'pm2': perona-malik, c=1/{1+(|grad(J)|/K)^2} [PM90]<BR>
&gt; %           'rmp': complex valued - ramp preserving [GSZ01]<BR>
&gt; % K    edge threshold parameter<BR>
&gt; % N    number of iterations<BR>
&gt; % dt   time increment (0 &lt; dt &lt;= 0.25, default 0.2)<BR>
&gt; % sigma2 - if present, calculates gradients of diffusion coefficient<BR>
&gt; %          convolved with gaussian of var sigma2 (Catte et al [CLMC92])<BR>
&gt;<BR>
&gt; if ~exist('N','var')<BR>
&gt;     %fprintf('No iterations\n')<BR>
&gt;    N=1;<BR>
&gt; end<BR>
&gt; if ~exist('K','var')<BR>
&gt;    % fprintf('No edge threshold\n')<BR>
&gt;    K=1;<BR>
&gt; end<BR>
&gt; if ~exist('dt','var')<BR>
&gt;    % fprintf('No time increment\n')<BR>
&gt;    dt=0.2;<BR>
&gt; end<BR>
&gt; if ~exist('theta','var')<BR>
&gt;    % fprintf('No theta\n')<BR>
&gt;    theta=pi/30;<BR>
&gt; end<BR>
&gt;<BR>
&gt; if ~exist('sigma2','var')<BR>
&gt;     %fprintf('No gradients of diffusion\n')<BR>
&gt;    sigma2=0;<BR>
&gt; end<BR>
&gt;<BR>
&gt; [Ny,Nx]=size(J);<BR>
&gt;<BR>
&gt; if (nargin&lt;3)<BR>
&gt;    error('not enough arguments (at least 3 should be given)');<BR>
&gt; end<BR>
&gt;<BR>
&gt; for i=1:N;<BR>
&gt;    % gaussian filter with kernel 5x5 (Catte et al)<BR>
&gt;    if (sigma2&gt;0)<BR>
&gt;       Jo = J;   % save J original<BR>
&gt;       J=gauss(J,7,sigma2);<BR>
&gt;    end<BR>
&gt;<BR>
&gt;         % calculate gradient in all directions (N,S,E,W)<BR>
&gt;         In=[J(1,:); J(1:Ny-1,:)]-J;<BR>
&gt;         Is=[J(2:Ny,:); J(Ny,:)]-J;<BR>
&gt;         Ie=[J(:,2:Nx) J(:,Nx)]-J;<BR>
&gt;     Iw=[J(:,1) J(:,1:Nx-1)]-J;<BR>
&gt;<BR>
&gt;         % calculate diffusion coefficients in all directions according to<BR>
&gt; method<BR>
&gt;    if (method == 'lin')<BR>
&gt;            Cn=K; Cs=K; Ce=K; Cw=K;<BR>
&gt;    elseif (method == 'pm1')<BR>
&gt;         Cn=exp(-(abs(In)/K).^2);<BR>
&gt;                 Cs=exp(-(abs(Is)/K).^2);<BR>
&gt;                 Ce=exp(-(abs(Ie)/K).^2);<BR>
&gt;                 Cw=exp(-(abs(Iw)/K).^2);<BR>
&gt;    elseif (method == 'pm2')<BR>
&gt;            Cn=1./(1+(abs(In)/K).^2);<BR>
&gt;                 Cs=1./(1+(abs(Is)/K).^2);<BR>
&gt;                 Ce=1./(1+(abs(Ie)/K).^2);<BR>
&gt;       Cw=1./(1+(abs(Iw)/K).^2);<BR>
&gt;    elseif (method == 'rmp')  % complex - ramp preserving<BR>
&gt;       k=K;  j=sqrt(-1);<BR>
&gt;<BR>
&gt;            Cn=exp(j*theta)./(1+(imag(In)/(k*theta)).^2);<BR>
&gt;            Cs=exp(j*theta)./(1+(imag(Is)/(k*theta)).^2);<BR>
&gt;            Ce=exp(j*theta)./(1+(imag(Ie)/(k*theta)).^2);<BR>
&gt;        Cw=exp(j*theta)./(1+(imag(Iw)/(k*theta)).^2);<BR>
&gt;<BR>
&gt;         else<BR>
&gt;       error(['Unknown method &quot;' method '&quot;']);<BR>
&gt;    end<BR>
&gt;<BR>
&gt;    if (sigma2&gt;0)   % calculate real gradiants (not smoothed)<BR>
&gt;         In=[Jo(1,:); Jo(1:Ny-1,:)]-Jo;<BR>
&gt;                 Is=[Jo(2:Ny,:); Jo(Ny,:)]-Jo;<BR>
&gt;                 Ie=[Jo(:,2:Nx) Jo(:,Nx)]-Jo;<BR>
&gt;       Iw=[Jo(:,1) Jo(:,1:Nx-1)]-Jo;<BR>
&gt;       J=Jo;<BR>
&gt;         end<BR>
&gt;<BR>
&gt;    % Next Image J<BR>
&gt;    J=J+dt*(Cn.*In + Cs.*Is + Ce.*Ie + Cw.*Iw);<BR>
&gt;<BR>
&gt; end; % for i<BR>
&gt;<BR>
&gt; Jd = J;<BR>
&gt;<BR>
&gt;<BR>
&gt; %%%% Refs:<BR>
&gt; % [PM90] P. Perona, J. Malik, &quot;Scale-space and edge detection using<BR>
&gt; anisotropic diffusion&quot;, PAMI 12(7), pp. 629-639, 1990.<BR>
&gt; % [CLMC92] F. Catte, P. L. Lions, J. M. Morel and T. Coll, &quot;Image selective<BR>
&gt; smoothing and edge detection by nonlinear diffusion&quot;, SIAM J. Num. Anal.,<BR>
&gt; vol. 29, no. 1, pp. 182-193, 1992.<BR>
&gt; % [GSZ01] G. Gilboa, N. Sochen, Y. Y. Zeevi, &quot;Complex Diffusion Processes<BR>
&gt; for Image Filtering&quot;, Scale-Space 2001, LNCS 2106, pp. 299-307,<BR>
&gt; Springer-Verlag 2001.<BR>
&gt;<BR>
&gt;<BR>
&gt;<BR>
&gt; -----Original Message-----<BR>
&gt; From: Bill Lorensen [<A HREF="mailto:bill.lorensen@gmail.com">mailto:bill.lorensen@gmail.com</A>]<BR>
&gt; Sent: Tue 12/1/2009 1:01 PM<BR>
&gt; To: O'Connor, Michael<BR>
&gt; Cc: insight-users@itk.org<BR>
&gt; Subject: Re: [Insight-users] Problem implementing<BR>
&gt; GradientAnisotropicDiffusionImageFilter<BR>
&gt;<BR>
&gt; Can you post the matlab source code for the algorithm? Perhaps there<BR>
&gt; is a difference in parameters? Or implementation?<BR>
&gt;<BR>
&gt; On Tue, Dec 1, 2009 at 8:48 AM, O'Connor, Michael<BR>
&gt; &lt;Michael.OConnor@umassmed.edu&gt; wrote:<BR>
&gt;&gt;  Hi,<BR>
&gt;&gt;    I am new to ITK.  I have just started changing some of my<BR>
&gt;&gt; post-processing<BR>
&gt;&gt; tools from MATLAB to ITK (Version 3.12).  So far I have only had one issue<BR>
&gt;&gt; that I cannot solve and that is implementing<BR>
&gt;&gt; GradientAnisotropicDiffusionImageFilter.  I can workaround this issue but<BR>
&gt;&gt; would rather get to the bottom of my problem as I suspect that I am<BR>
&gt;&gt; missing<BR>
&gt;&gt; something fundamental about data type in ITK.  I have read pertinent<BR>
&gt;&gt; sections of ITK Software Guide 2nd Edition (dated 11/21/05) and template<BR>
&gt;&gt; guide on www.itk.org.<BR>
&gt;&gt;     I am processing data obtained on a prototype CT system and am<BR>
&gt;&gt; processing<BR>
&gt;&gt; in order to eventually segment between one tissue type (approx linear<BR>
&gt;&gt; attenuation coefficient 0.024 per mm) from another (approx attenuation<BR>
&gt;&gt; coefficient 0.031 per mm).  Setting parameters of 5 iterations, timestep<BR>
&gt;&gt; of<BR>
&gt;&gt; 0.125 and conductance 0.003, there is minimal filtering when using<BR>
&gt;&gt; following<BR>
&gt;&gt; ITK program (i.e. not consistent with conductance parameter).   Using same<BR>
&gt;&gt; values and same test input file in MATLAB, I do get reasonable output.<BR>
&gt;&gt; If<BR>
&gt;&gt; I take another test input file scaled up by 10000 (both data values and<BR>
&gt;&gt; conductance - i.e. approx data coefficients 240 per mm and 310 per mm and<BR>
&gt;&gt; conductance 30), I do obtain reasonable results with the same ITK program<BR>
&gt;&gt; (as well as MATLAB program with only change in conductance).<BR>
&gt;&gt;    As pixel type is float in either case, I cannot understand why the<BR>
&gt;&gt; GradientAnisotropicDiffusionImageFilter does not work with both range of<BR>
&gt;&gt; data values in ITK as it does in MATLAB.  While I can perform scaling to<BR>
&gt;&gt; workaround my ITK issue, as stated, I suspect that I am doing something<BR>
&gt;&gt; wrong in ITK and would rather correct my misunderstanding.   I would<BR>
&gt;&gt; greatly<BR>
&gt;&gt; appreciate any comments or suggestions.<BR>
&gt;&gt;<BR>
&gt;&gt; Regards,<BR>
&gt;&gt;    Michael O'Connor<BR>
&gt;&gt;<BR>
&gt;&gt;<BR>
&gt;&gt; /*=========================================================================<BR>
&gt;&gt;<BR>
&gt;&gt;   Program:   ITKFilterTest<BR>
&gt;&gt;   Module:    ITKFilterTest.cxx<BR>
&gt;&gt;   Language:  C++<BR>
&gt;&gt;   Date:      24 Nov 2009<BR>
&gt;&gt;   Version:   Revision: 1.0   Mike O'Connor<BR>
&gt;&gt;<BR>
&gt;&gt;<BR>
&gt;&gt; =========================================================================*/<BR>
&gt;&gt;<BR>
&gt;&gt; // NOTE: much of this code and description is taken directly from ITK<BR>
&gt;&gt; documentation. Module initially based<BR>
&gt;&gt; //  on the Filter Example modules in ITK source code.<BR>
&gt;&gt; //  The module runs one ITK filter.<BR>
&gt;&gt; //<BR>
&gt;&gt; //  Filter 1: is ITK GradientAnisotropicDiffusionImageFilter. This filter<BR>
&gt;&gt; implements an<BR>
&gt;&gt; //    N-dimensional version of the classic Perona-Malik anisotropic<BR>
&gt;&gt; diffusion<BR>
&gt;&gt; //    equation for scalar-valued images (Perona 1990).<BR>
&gt;&gt; //<BR>
&gt;&gt; //    The conductance term for this implementation is chosen as a function<BR>
&gt;&gt; of the<BR>
&gt;&gt; //    gradient magnitude of the image at each point, reducing the strength<BR>
&gt;&gt; of<BR>
&gt;&gt; //    diffusion at edge pixels.<BR>
&gt;&gt; //<BR>
&gt;&gt; //    The numerical implementation of this equation is similar to that<BR>
&gt;&gt; described<BR>
&gt;&gt; //    in the Perona-Malik paper, but uses a more robust technique<BR>
&gt;&gt; //    for gradient magnitude estimation and has been generalized to<BR>
&gt;&gt; N-dimensions.<BR>
&gt;&gt; //  Input Parameters for this implementation are passed using a 'config<BR>
&gt;&gt; file'.  Objects and methods for the<BR>
&gt;&gt; //  config file are based on CBSS.  There are booleans to determine if one<BR>
&gt;&gt; or both of the filters are run.<BR>
&gt;&gt; //  The input parameters for each filter as well as parameters for file<BR>
&gt;&gt; reader.<BR>
&gt;&gt;<BR>
&gt;&gt;<BR>
&gt;&gt; #include &quot;itkImage.h&quot;<BR>
&gt;&gt; #include &quot;itkImageFileReader.h&quot;<BR>
&gt;&gt; #include &quot;itkImageFileWriter.h&quot;<BR>
&gt;&gt; #include &quot;itkRawImageIO.h&quot;<BR>
&gt;&gt; #include &quot;itkGradientAnisotropicDiffusionImageFilter.h&quot;<BR>
&gt;&gt; #include &quot;FilterSystem.h&quot;<BR>
&gt;&gt; #include &quot;Filter.h&quot;<BR>
&gt;&gt; #include &quot;Files.h&quot;<BR>
&gt;&gt; #include &quot;Message.h&quot;<BR>
&gt;&gt;<BR>
&gt;&gt;<BR>
&gt;&gt;<BR>
&gt;&gt; const unsigned int Dimension = 2;<BR>
&gt;&gt;<BR>
&gt;&gt; int main( int argc, char * argv[] )<BR>
&gt;&gt; {<BR>
&gt;&gt;  // This is structure for our config file (used for parameter passing)<BR>
&gt;&gt;   FilterSystem f_system;<BR>
&gt;&gt;   WhatFunction function = Filter;<BR>
&gt;&gt;   if(parseArgs(argc,argv) == UtilError) return EXIT_FAILURE;<BR>
&gt;&gt;   if(f_system.initialize(function, usage) ==<BR>
&gt;&gt; UtilError)closeAndExit(EXIT_FAILURE);<BR>
&gt;&gt;<BR>
&gt;&gt;   typedef    float    InputPixelType;<BR>
&gt;&gt;   typedef    float    OutputPixelType;<BR>
&gt;&gt;<BR>
&gt;&gt; //<BR>
&gt;&gt; // Instatiate using input &amp; output image types<BR>
&gt;&gt; //<BR>
&gt;&gt;   typedef itk::Image&lt;<BR>
&gt;&gt;                         InputPixelType,<BR>
&gt;&gt;                         Dimension &gt;             InputImageType;<BR>
&gt;&gt;   typedef itk::Image&lt;<BR>
&gt;&gt;                         OutputPixelType,<BR>
&gt;&gt;                         Dimension &gt;             OutputImageType;<BR>
&gt;&gt;   typedef itk::ImageFileReader&lt;<BR>
&gt;&gt;                         InputImageType &gt;        ReaderType;<BR>
&gt;&gt;   typedef itk::GradientAnisotropicDiffusionImageFilter&lt;<BR>
&gt;&gt;                         InputImageType,<BR>
&gt;&gt;                         OutputImageType &gt;       ADF_FilterType;<BR>
&gt;&gt;   typedef itk::RawImageIO&lt;<BR>
&gt;&gt;                         InputPixelType,<BR>
&gt;&gt;                         Dimension       &gt;       ImageIOType;<BR>
&gt;&gt;   typedef itk::ImageFileWriter&lt;<BR>
&gt;&gt;                         OutputImageType &gt;<BR>
&gt;&gt; WriterType;<BR>
&gt;&gt; //<BR>
&gt;&gt; // Filter object, Image object and Reader &amp; Writer object are  created<BR>
&gt;&gt; //<BR>
&gt;&gt;   ImageIOType::Pointer  rawIO           = ImageIOType::New();<BR>
&gt;&gt;   ReaderType::Pointer   reader          = ReaderType::New();<BR>
&gt;&gt;   ADF_FilterType::Pointer ADfilter      = ADF_FilterType::New();<BR>
&gt;&gt;   WriterType::Pointer   writer2         = WriterType::New();<BR>
&gt;&gt;<BR>
&gt;&gt; // Get parameters from config file<BR>
&gt;&gt;   rawIO-&gt;SetHeaderSize(f_system.m_cfg.header);<BR>
&gt;&gt;   rawIO-&gt;SetDimensions(0, f_system.m_cfg.file_dim_x);<BR>
&gt;&gt;   rawIO-&gt;SetDimensions(1, f_system.m_cfg.file_dim_y);<BR>
&gt;&gt;   rawIO-&gt;SetByteOrderToLittleEndian();<BR>
&gt;&gt;<BR>
&gt;&gt;   // Define Input file<BR>
&gt;&gt;   writeMsg(DEBUG1, &quot;Input File: %s \n&quot;,files.input);<BR>
&gt;&gt;   reader-&gt;SetFileName( files.input );<BR>
&gt;&gt;   reader-&gt;SetImageIO( rawIO );<BR>
&gt;&gt; //  reader-&gt;Update();           //Read the file<BR>
&gt;&gt;   //<BR>
&gt;&gt;   //Get other parameters from Config file<BR>
&gt;&gt;   const unsigned int    numberOfIterations =  f_system.m_cfg.iter;<BR>
&gt;&gt;   const double          timeStep = (double) f_system.m_cfg.timestep;<BR>
&gt;&gt;   const double          conductance = (double) f_system.m_cfg.conductance;<BR>
&gt;&gt;   writeMsg(DEBUG1,&quot;Version 2: Iterations = %i, Timestep = %f,  Conductance<BR>
&gt;&gt; =<BR>
&gt;&gt; %f \n&quot;, numberOfIterations, timeStep, conductance);<BR>
&gt;&gt;<BR>
&gt;&gt;   //Set Parameters in ADF Filter &amp; invoke filter<BR>
&gt;&gt;   ADfilter-&gt;SetInput( reader-&gt;GetOutput() );<BR>
&gt;&gt;   ADfilter-&gt;SetNumberOfIterations( numberOfIterations );<BR>
&gt;&gt;   ADfilter-&gt;SetTimeStep( timeStep );<BR>
&gt;&gt;   ADfilter-&gt;SetConductanceParameter( conductance );<BR>
&gt;&gt;   ADfilter-&gt;Update();<BR>
&gt;&gt;<BR>
&gt;&gt;   //<BR>
&gt;&gt;   // Write the output file<BR>
&gt;&gt;   //<BR>
&gt;&gt;   writer2-&gt;SetImageIO (rawIO);<BR>
&gt;&gt;   writer2-&gt;SetFileName( files.output );<BR>
&gt;&gt;   writer2-&gt;SetInput( ADfilter-&gt;GetOutput() );<BR>
&gt;&gt;   writeMsg(DEBUG1, &quot;Writing output of the AnisoDiff to output File: %s<BR>
&gt;&gt; \n&quot;,files.output);<BR>
&gt;&gt;   writer2-&gt;Update();<BR>
&gt;&gt;   return EXIT_SUCCESS;<BR>
&gt;&gt;<BR>
&gt;&gt; }<BR>
&gt;&gt;<BR>
&gt;&gt;<BR>
&gt;&gt; _____________________________________<BR>
&gt;&gt; Powered by www.kitware.com<BR>
&gt;&gt;<BR>
&gt;&gt; Visit other Kitware open-source projects at<BR>
&gt;&gt; <A HREF="http://www.kitware.com/opensource/opensource.html">http://www.kitware.com/opensource/opensource.html</A><BR>
&gt;&gt;<BR>
&gt;&gt; Kitware offers ITK Training Courses, for more information visit:<BR>
&gt;&gt; <A HREF="http://www.kitware.com/products/protraining.html">http://www.kitware.com/products/protraining.html</A><BR>
&gt;&gt;<BR>
&gt;&gt; Please keep messages on-topic and check the ITK FAQ at:<BR>
&gt;&gt; <A HREF="http://www.itk.org/Wiki/ITK_FAQ">http://www.itk.org/Wiki/ITK_FAQ</A><BR>
&gt;&gt;<BR>
&gt;&gt; Follow this link to subscribe/unsubscribe:<BR>
&gt;&gt; <A HREF="http://www.itk.org/mailman/listinfo/insight-users">http://www.itk.org/mailman/listinfo/insight-users</A><BR>
&gt;&gt;<BR>
&gt;&gt;<BR>
&gt;<BR>
&gt;<BR>
&gt;<BR>
&gt;<BR>
<BR>
<BR>
</FONT>
</P>

</BODY>
</HTML>