Granulometry снежинок

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

Readimage

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

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

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

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

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

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

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

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

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

Figure contains an axes object. The axes object 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 object. The axes object 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 object. The axes object contains an object of type image.

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

| | | |