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

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

Чтение изображения

Читайте в изображении '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.

См. также

| | | |

Для просмотра документации необходимо авторизоваться на сайте