В этом примере показано, как рассчитать распределение размеров снежинок на изображении с помощью гранулометрии. Гранулометрия определяет распределение размеров объектов на изображении без явного сегментирования (обнаружения) каждого объекта.
Читайте на изображении «snowflakes.png», которое является фотографией снежинок.
I = imread('snowflakes.png');
imshow(I)
Первым шагом является максимизация контраста интенсивности изображения. Это можно сделать с помощью adapthisteq функция, выполняющая ограниченную контрастностью коррекцию адаптивной гистограммы. Масштабирование интенсивности изображения с помощью imadjust функция заполняет весь динамический диапазон типа данных.
claheI = adapthisteq(I,'NumTiles',[10 10]);
claheI = imadjust(claheI);
imshow(claheI)
Гранулометрия оценивает распределение интенсивности площади поверхности снежинок в зависимости от размера. Гранулометрия сравнивает объекты изображения с камнями, размеры которых можно определить, просеивая их через экраны увеличивающегося размера и собирая то, что осталось после каждого прохода. Просеивают объекты изображения, открывая изображение с элементом структурирования увеличивающегося размера и подсчитывая оставшуюся площадь поверхности интенсивности (суммирование значений пикселей в изображении) после каждого открытия.
Выберите предел счетчика, чтобы площадь поверхности интенсивности была равна нулю при увеличении размера элемента структурирования. Для отображения оставьте пустыми первую запись в массиве площади поверхности.
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)')

Значительное падение интенсивности поверхности между двумя последовательными проемами указывает на то, что изображение содержит объекты размером, сравнимым с меньшим проемом. Это эквивалентно первой производной массива площади поверхности интенсивности, который содержит распределение размеров снежинок на изображении. Вычислите первую производную с помощью diff функция.
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')

Обратите внимание на минимумы и радиусы, в которых они возникают на графике. Минимумы говорят вам, что снежинки на изображении имеют эти радиусы. Чем отрицательнее минимальная точка, тем выше совокупная интенсивность снежинок на этом радиусе. Например, самая отрицательная минимальная точка находится на отметке радиуса 5 пикселей. Можно извлечь снежинки с радиусом 5 пикселей, выполнив следующие шаги.
open5 = imopen(claheI,strel('disk',5)); open6 = imopen(claheI,strel('disk',6)); rad5 = imsubtract(open5,open6); imshow(rad5,[])

adapthisteq | imadjust | imopen | imsubtract | strel