Этот пример показывает, как вычислить распределение размеров снежинок в изображении с помощью гранулометрии. Гранулометрия определяет распределение размеров объектов в изображении, не сегментируя (обнаруживая) сначала каждый объект.
Читайте в изображении 'snowflakes.png', которое представляет собой фотографию снежинок.
I = imread('snowflakes.png');
imshow(I)
Ваш первый шаг - максимизировать контраст интенсивности в изображении. Вы можете сделать это с помощью adapthisteq
функция, которая выполняет ограниченную контрастом адаптивную гистограмму эквализации. Измените интенсивность изображения заново с помощью imadjust
функция так, чтобы она заполняла всюсь динамическую область значений типа данных.
claheI = adapthisteq(I,'NumTiles',[10 10]);
claheI = imadjust(claheI);
imshow(claheI)
Гранулометрия оценивает распределение площади поверхности снежинок в зависимости от размера. Гранулометрия сравнивает объекты изображения с камнями, размеры которых могут быть определены путем просеивания их через экраны увеличивающегося размера и сбора того, что остается после каждого прохода. Объекты изображения просеивают путем открытия изображения с помощью элемента структурирования увеличивающегося размера и подсчета оставшейся площади поверхности интенсивности (суммирования значений пикселей в изображении) после каждого открытия.
Выберите предел счетчика, чтобы площадь поверхности интенсивности ушла в нуль, когда вы увеличиваете размер вашего элемента структурирования. В целях отображения оставьте первую запись в массиве площадей поверхности пустой.
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
| imsubtract
| strel