В этом примере показано, как улучшить изображение как этап предварительной обработки перед анализом. В этом примере корректируется неравномерное фоновое освещение и изображение преобразуется в двоичное изображение, что упрощает идентификацию объектов переднего плана (отдельных зерен риса). Затем можно проанализировать объекты, например, найти площадь каждого зерна риса, а также вычислить статистику для всех объектов изображения.
Чтение изображения в рабочую область.
I = imread('rice.png');
imshow(I)
Фоновая подсветка ярче в центре изображения, чем внизу. Выполните предварительную обработку изображения, чтобы сделать подсветку фона более равномерной.
В качестве первого шага удалите весь передний план (зерна риса), используя морфологическое отверстие. Операция открытия удаляет небольшие объекты, которые не могут полностью содержать элемент структурирования. Определите дискообразный структурирующий элемент радиусом 15, который полностью входит в единое зерно риса.
se = strel('disk',15)se =
strel is a disk shaped structuring element with properties:
Neighborhood: [29x29 logical]
Dimensionality: 2
Для выполнения морфологического вскрытия используйте imopen с элементом структурирования.
background = imopen(I,se); imshow(background)

Вычитание фонового аппроксимационного изображения, background, из исходного изображения, Iи просмотрите полученное изображение. После вычитания скорректированного фонового изображения из исходного изображения полученное изображение имеет однородный фон, но теперь немного темно для анализа.
I2 = I - background; imshow(I2)

Использовать imadjust для увеличения контрастности обрабатываемого изображения I2 путем насыщения 1% данных как при низкой, так и при высокой интенсивности и путем растяжения значений интенсивности для заполнения uint8 динамический диапазон.
I3 = imadjust(I2); imshow(I3)

Следует отметить, что предыдущие два этапа могут быть заменены одним этапом с использованием imtophat который сначала вычисляет морфологическое отверстие, а затем вычитает его из исходного изображения.
I2 = imtophat(I,strel('disk',15));
Создайте двоичную версию обработанного изображения, чтобы можно было использовать функции панели инструментов для анализа. Используйте imbinarize функция для преобразования изображения в оттенках серого в двоичное изображение. Удалите фоновый шум из изображения с помощью bwareaopen функция.
bw = imbinarize(I3); bw = bwareaopen(bw,50); imshow(bw)

После создания двоичной версии исходного изображения можно выполнить анализ объектов на изображении.
Найдите все подключенные компоненты (объекты) в двоичном изображении. Точность результатов зависит от размера объектов, параметра связности (4, 8 или произвольного), а также от того, соприкасаются ли какие-либо объекты (в этом случае они могут быть помечены как один объект). Некоторые зерна риса в двоичном изображении bw трогательные.
cc = bwconncomp(bw,4)
cc = struct with fields:
Connectivity: 4
ImageSize: [256 256]
NumObjects: 95
PixelIdxList: {1x95 cell}
cc.NumObjects
ans = 95
Просмотрите зерно риса с меткой 50 на изображении.
grain = false(size(bw));
grain(cc.PixelIdxList{50}) = true;
imshow(grain)
Визуализируйте все связанные компоненты изображения, создавая матрицу меток и отображая ее как псевдоколорное индексированное изображение.
Использовать labelmatrix для создания матрицы меток из выходных данных bwconncomp. Обратите внимание, что labelmatrix сохраняет матрицу меток в наименьшем числовом классе, необходимом для количества объектов.
labeled = labelmatrix(cc);
whos labeledName Size Bytes Class Attributes labeled 256x256 65536 uint8
Использовать label2rgb чтобы выбрать карту цветов, цвет фона и способ сопоставления объектов в матрице меток с цветами в карте цветов. В псевдоколорном изображении метка, идентифицирующая каждый объект в матрице меток, отображается на другой цвет в связанной матрице карты цветов.
RGB_label = label2rgb(labeled,'spring','c','shuffle'); imshow(RGB_label)

Вычислить площадь каждого объекта изображения с помощью regionprops. Каждое рисовое зерно является одним связанным компонентом в cc структура.
graindata = regionprops(cc,'basic')graindata=95×1 struct array with fields:
Area
Centroid
BoundingBox
Создание нового вектора grain_areas, которая содержит измерение площади для каждого зерна.
grain_areas = [graindata.Area];
Найдите область 50-го компонента.
grain_areas(50)
ans = 194
Найдите и просмотрите зерно с наименьшей площадью.
[min_area, idx] = min(grain_areas)
min_area = 61
idx = 16
grain = false(size(bw));
grain(cc.PixelIdxList{idx}) = true;
imshow(grain)
Используйте histogram для создания гистограммы площадей рисового зерна.
histogram(grain_areas)
title('Histogram of Rice Grain Area')
bwareaopen | bwconncomp | imadjust | imbinarize | imopen | imread | imshow | label2rgb | labelmatrix | regionprops