Granulometry снежинок

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

Readimage

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

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

Улучшите контраст

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

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

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

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

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

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,[])

Смотрите также

| | | |