www.gusucode.com > images 案例代码 matlab源码程序 > images/SnowflakesGranulometryExample.m

    %% Granulometry of Snowflakes
% This example shows how to calculate the size distribution of snowflakes in an
% image by using granulometry.  Granulometry determines the size distribution of
% objects in an image without explicitly segmenting (detecting) each object
% first.
%
% Copyright 1993-2014 The MathWorks, Inc.

%% Read Image
% Read in the 'snowflakes.png' image, which is a photograph of snowflakes.

I = imread('snowflakes.png');
figure
imshow(I)

%% Enhance Contrast
% Your first step is to maximize the intensity contrast in the image.  You can
% do this using ADAPTHISTEQ, which performs contrast-limited adaptive histogram
% equalization. Rescale the image intensity using IMADJUST so that it
% fills the data type's entire dynamic range.

claheI = adapthisteq(I,'NumTiles',[10 10]);
claheI = imadjust(claheI);
imshow(claheI)

%% Determine Intensity Surface Area Distribution in Enhanced Image
% Granulometry estimates the intensity surface area distribution of
% snowflakes as a function of size. Granulometry likens image objects to stones
% whose sizes can be determined by sifting them through screens of increasing
% size and collecting what remains after each pass. Image objects are sifted by
% opening the image with a structuring element of increasing size and counting
% the remaining intensity surface area (summation of pixel values in the image)
% after each opening. 
%
% Choose a counter limit so that the intensity surface area goes to zero as
% you increase the size of your structuring element.
% For display purposes, leave the first entry in the surface area array empty.
radius_range = 0:22;
intensity_area = zeros(size(radius_range));
for counter = radius_range
    remain = imopen(claheI, strel('disk', counter));
    intensity_area(counter + 1) = sum(remain(:));  
end
figure
plot(intensity_area, 'm - *')
grid on
title('Sum of pixel values in opened image versus radius')
xlabel('radius of opening (pixels)')
ylabel('pixel value sum of opened objects (intensity)')

%% Calculate First Derivative of Distribution
% A significant drop in intensity surface area between two consecutive openings
% indicates that the image contains objects of comparable size to the smaller
% opening. This is equivalent to the first derivative of the intensity surface
% area array, which contains the size distribution of the snowflakes in the
% image. Calculate the first derivative with the DIFF function.

intensity_area_prime = diff(intensity_area);
plot(intensity_area_prime, 'm - *')
grid on
title('Granulometry (Size Distribution) of Snowflakes')
ax = gca;
ax.XTick = [0 2 4 6 8 10 12 14 16 18 20 22];
xlabel('radius of snowflakes (pixels)')
ylabel('Sum of pixel values in snowflakes as a function of radius')

%% Extract Snowflakes Having a Particular Radius
% Notice the minima and the radii where they occur in the graph.  The minima
% tell you that snowflakes in the image have those radii. The more negative the
% minimum point, the higher the snowflakes' cumulative intensity at that radius.
% For example, the most negative minimum point occurs at the 5 pixel radius
% mark. You can extract the snowflakes having a 5 pixel radius with the
% following steps.

open5 = imopen(claheI,strel('disk',5));
open6 = imopen(claheI,strel('disk',6));
rad5 = imsubtract(open5,open6);
imshow(rad5,[])