www.gusucode.com > fuzzy_featured 案例源码程序 matlab代码 > fuzzy_featured/fuzzyedgedemo.m

    %% Fuzzy Logic Image Processing
%
% This example shows how to use Fuzzy Logic Toolbox software for image processing.
% Specifically, this example shows how to detect edges in an image. 
%
% An edge is a boundary between two uniform regions. You can detect an edge
% by comparing the intensity of neighboring pixels. However, because uniform
% regions are not crisply defined, small intensity
% differences between two neighboring pixels do not always represent an
% edge. Instead, the intensity difference might represent a
% shading effect.
%
% The fuzzy logic approach for image processing allows you to use
% membership functions to define the degree to which a pixel belongs to an
% edge or a uniform region. 
%
% Copyright 2013 The MathWorks, Inc. 

%% Import RGB Image and Convert to Grayscale
%
% Import the image into MATLAB.
Irgb = imread('peppers.png'); 
%%
% |Irgb| is a 384 x 512 x 3 |uint8| array. The three channels of |Irgb|
% (third array dimension) represent the red, green, and blue intensities of
% the image.
%%
% Convert |Irgb| to grayscale so that you can work with a 2-D array instead
% of a 3-D array. Use the standard NTSC conversion formula to calculate
% the effective luminance of each pixel.
Igray = 0.2989*Irgb(:,:,1)+0.5870*Irgb(:,:,2)+0.1140*Irgb(:,:,3);

figure; image(Igray,'CDataMapping','scaled'); colormap('gray');
title('Input Image in Grayscale')
%%
% Alternatively, you can use the |rgb2gray| function in the Image Processing
% Toolbox software to convert |Irgb| to grayscale.
%
%% Convert Image to Double-Precision Data
%
% The Fuzzy Logic Toolbox software operates on double-precision numbers only.
% So, convert |Igray|, a |uint8| array, to a |double| array.
I = double(Igray); 
%%
% Because |uint8| values are in the [0 2^8-1] range, all elements of |I|
% are in that range too. Scale |I| so that its elements are in the [0 1]
% range.
%
classType = class(Igray);                 
scalingFactor = double(intmax(classType));  
I = I/scalingFactor;      
%%
% Alternatively, you can use the |im2double| function in the Image Processing
% Toolbox software to convert |Igray| to a scaled, double-precision image.
%% Obtain Image Gradient
%
% The fuzzy logic edge-detection algorithm for this example relies on the
% image gradient to locate breaks in uniform regions. Calculate the image
% gradient along the _x_-axis and _y_-axis.
Gx = [-1 1];
Gy = Gx';
Ix = conv2(I,Gx,'same');
Iy = conv2(I,Gy,'same');

figure; image(Ix,'CDataMapping','scaled'); colormap('gray'); title('Ix');
figure; image(Iy,'CDataMapping','scaled'); colormap('gray'); title('Iy');
%% 
% |Gx| and |Gy| are simple gradient filters. You convolve |I| with |Gx|,
% using the |conv2| function, to obtain a matrix containing the _x_-axis
% gradients of |I|. The gradient values are in the [-1 1] range.
% Similarly, you convolve |I| with |Gy| to obtain the _y_-axis gradients of
% |I|. You can use other filters to obtain the image gradients, such as the
% Sobel operator or the Prewitt operator. For information about how you can
% filter an image using convolution, see
% <http://www.mathworks.com/help/images/designing-and-implementing-linear-filters-in-the-spatial-domain.html#f16-20755
% Convolution>.
%
% Alternatively, if you have the Image Processing Toolbox software, you can
% use the |imfilter|, |imgradientxy|, or |imgradient| functions to obtain the
% image gradients.
%% Define Fuzzy Inference System (FIS) for Edge Detection
% Create a Fuzzy Inference System (FIS) for edge detection, |edgeFIS|.
%
edgeFIS = newfis('edgeDetection');
%%
% Specify the image gradients, |Ix| and |Iy|, as the inputs of |edgeFIS|.
edgeFIS = addvar(edgeFIS,'input','Ix',[-1 1]);
edgeFIS = addvar(edgeFIS,'input','Iy',[-1 1]);
%%
% Specify a zero-mean Gaussian membership function for each input. If the
% gradient value for a pixel is |0|, then it belongs to the zero membership
% function with a degree of |1|.
sx = 0.1; sy = 0.1;
edgeFIS = addmf(edgeFIS,'input',1,'zero','gaussmf',[sx 0]);
edgeFIS = addmf(edgeFIS,'input',2,'zero','gaussmf',[sy 0]);
%%
% |sx| and |sy| specify the standard deviation for the zero membership
% function for the |Ix| and |Iy| inputs. You can change the values of |sx|
% and |sy| to adjust the edge detector performance. Increasing the values makes the
% algorithm less sensitive to the edges in the image and decreases the
% intensity of the detected edges.
%%
% Specify the intensity of the edge-detected image as an output of |edgeFIS|.
edgeFIS = addvar(edgeFIS,'output','Iout',[0 1]); 
%%
% Specify the triangular membership functions, white and black, for |Iout|. 
wa = 0.1; wb = 1; wc = 1;
ba = 0; bb = 0; bc = .7;
edgeFIS = addmf(edgeFIS,'output',1,'white','trimf',[wa wb wc]);
edgeFIS = addmf(edgeFIS,'output',1,'black','trimf',[ba bb bc]);
%%
% As you can with |sx| and |sy|, you can change the values of |wa|, |wb|, |wc|,
% |ba|, |bb|, and |bc| to adjust the edge detector performance. The
% triplets specify the start, peak, and end of the triangles of the
% membership functions. These parameters influence the intensity of the
% detected edges.
% 
%%
% Plot the membership functions of the inputs/outputs of |edgeFIS|.
figure
subplot(2,2,1); plotmf(edgeFIS,'input',1); title('Ix');
subplot(2,2,2); plotmf(edgeFIS,'input',2); title('Iy');
subplot(2,2,[3 4]); plotmf(edgeFIS,'output',1); title('Iout')
%% Specify FIS Rules
% Add rules to make a pixel white if it belongs to a uniform region.
% Otherwise, make the pixel black.
r1 = 'If Ix is zero and Iy is zero then Iout is white';
r2 = 'If Ix is not zero or Iy is not zero then Iout is black';
r = char(r1,r2);
edgeFIS = parsrule(edgeFIS,r);
showrule(edgeFIS)
%% Evaluate FIS
% Evaluate the output of the edge detector for each row of pixels in |I|
% using corresponding rows of |Ix| and |Iy| as inputs.
Ieval = zeros(size(I));% Preallocate the output matrix
for ii = 1:size(I,1)
    Ieval(ii,:) = evalfis([(Ix(ii,:));(Iy(ii,:));]',edgeFIS);
end
%% Plot Results
figure; image(I,'CDataMapping','scaled'); colormap('gray');
title('Original Grayscale Image')

figure; image(Ieval,'CDataMapping','scaled'); colormap('gray');
title('Edge Detection Using Fuzzy Logic')
%% Summary
%
% You detected the edges in an image using a FIS, comparing the 
% gradient of every pixel in the _x_ and _y_ directions. If the 
% gradient for a pixel is not zero, then the pixel belongs to an edge
% (black). You defined the gradient as zero using Gaussian
% membership functions for your FIS inputs.
%