Этот пример показывает, как улучшить изображение как шаг предварительной обработки перед анализом. В этом примере вы исправляете неоднородную подсветку фона и преобразуете изображение в бинарное изображение, чтобы облегчить идентификацию объектов переднего плана (отдельных зерен риса). Затем можно проанализировать объекты, такие как нахождение площади каждого зерна риса, и можно вычислить статистику для всех объектов на изображении.
Чтение изображения в рабочую область.
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