Saturday, March 20, 2010

Fuzzy image Dilation and Erosion

One of the generic approaches to fuzzy Morphology is the Fuzzy Dilation and Fuzzy Erosion . Based on an trouble that I faced with during the Fuzzy image Analysis course , I decided to publish the Matlab code , based on the paper by "Bloch and Maitre" on "Fuzzy mathematical morphologies: A comparative study" . This is just the implementation of Definition 1 (page 1344 ). Needless to say that next definition are the same to Def 1 . Just play with the parameters :)

Here is the code :

%{
        Fuzzy Dilation and Erosion
        
        Copyright 2010 Vahid Rafiei .        
        This program is free software; you can redistribute it and/or modify
        it under the terms of the GNU General Public License as published by
        the Free Software Foundation; either version 2 of the License, or
        (at your option) any later version.
        
        This program 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 General Public License for more details.
        
        You should have received a copy of the GNU General Public License
        along with this program; if not, write to the Free Software
        Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
        MA 02110-1301, USA.
%}


% Settings
len=512;
useNoise=0;
strel=1;

%% Define v
if strel==1
x=linspace(-10,10,len);
v=2-(x).^2;
v(v<0)=0;
end

v=v/max(v);
plot(v,'--');


%% define mu
x=linspace(-4,4,len);
mu=3-x.^4+4*x.^2;
mu(mu<0)=0;
mu=mu/max(mu);
if(useNoise)
    mu=mu+0.1*(rand(size(mu))-0.5);
end

hold on
plot(mu,'-','Color','red')


legend({'V','mu'})

% mu and v is ready

%% Definition 1

% Dilation

nalpha=10;
alph=linspace(0.0001,1,nalpha);
deltaAlpha=1/nalpha;

Dmu=zeros(size(mu));

tic
for a = alph
   valpha=v>=a;     
  for x=1:numel(mu)    
      mask=zeros(size(mu));
      mask(x)=1;
      mask=convn(mask,valpha,'same');
      Dmu(x)=Dmu(x)+max(mask.*mu)*deltaAlpha;      
  end  
end
toc

figure(2)
plot(mu,'Color', 'red');
hold on
plot(Dmu,'Color','blue');
legend({'\mu','D\mu'})
title('Dilation (Def. 1)');

% Erosion
Emu=zeros(size(mu));

tic
for a = alph
   valpha=v>=a;     
  for x=1:numel(mu)    
      mask=zeros(size(mu));
      mask(x)=1;
      mask=convn(mask,valpha,'same');
      mask(mask==0)=NaN;
      Emu(x)=Emu(x)+min(mask.*mu)*deltaAlpha;   
  end  
end
toc

figure(3)
plot(mu,'Color', 'red');
hold on
plot(Emu,'Color','blue');
legend({'\mu','E\mu'})
title('Erosion (Def. 1)');


Cheers ,