В этом примере показано, как вычислить распределение размера снежинок в изображении при помощи granulometry. Granulometry определяет распределение размера объектов в изображении, явным образом не сегментируясь (обнаруживающий) каждый объект сначала.
Читайте в изображении '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,[])
adapthisteq
| imadjust
| imopen
| strel
| imsubtract