exponenta event banner

Гранулометрия снежинок

В этом примере показано, как рассчитать распределение размеров снежинок на изображении с помощью гранулометрии. Гранулометрия определяет распределение размеров объектов на изображении без явного сегментирования (обнаружения) каждого объекта.

Прочитать изображение

Читайте на изображении «snowflakes.png», которое является фотографией снежинок.

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

Figure contains an axes. The axes contains an object of type image.

Повышение контрастности

Первым шагом является максимизация контраста интенсивности изображения. Это можно сделать с помощью adapthisteq функция, выполняющая ограниченную контрастностью коррекцию адаптивной гистограммы. Масштабирование интенсивности изображения с помощью imadjust функция заполняет весь динамический диапазон типа данных.

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

Figure contains an axes. The axes contains an object of type image.

Определение распределения площади поверхности по интенсивности на улучшенном изображении

Гранулометрия оценивает распределение интенсивности площади поверхности снежинок в зависимости от размера. Гранулометрия сравнивает объекты изображения с камнями, размеры которых можно определить, просеивая их через экраны увеличивающегося размера и собирая то, что осталось после каждого прохода. Просеивают объекты изображения, открывая изображение с элементом структурирования увеличивающегося размера и подсчитывая оставшуюся площадь поверхности интенсивности (суммирование значений пикселей в изображении) после каждого открытия.

Выберите предел счетчика, чтобы площадь поверхности интенсивности была равна нулю при увеличении размера элемента структурирования. Для отображения оставьте пустыми первую запись в массиве площади поверхности.

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)')

Figure contains an axes. The axes with title Sum of pixel values in opened image versus radius contains an object of type line.

Расчет первой производной распределения

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

Figure contains an axes. The axes with title Granulometry (Size Distribution) of Snowflakes contains an object of type line.

Извлечь снежинки с определенным радиусом

Обратите внимание на минимумы и радиусы, в которых они возникают на графике. Минимумы говорят вам, что снежинки на изображении имеют эти радиусы. Чем отрицательнее минимальная точка, тем выше совокупная интенсивность снежинок на этом радиусе. Например, самая отрицательная минимальная точка находится на отметке радиуса 5 пикселей. Можно извлечь снежинки с радиусом 5 пикселей, выполнив следующие шаги.

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

Figure contains an axes. The axes contains an object of type image.

См. также

| | | |