exponenta event banner

Исправление неравномерного освещения и анализ объектов переднего плана

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

Предварительная обработка изображения

Чтение изображения в рабочую область.

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

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

Фоновая подсветка ярче в центре изображения, чем внизу. Выполните предварительную обработку изображения, чтобы сделать подсветку фона более равномерной.

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

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

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

I2 = I - background;
imshow(I2)

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

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

I3 = imadjust(I2);
imshow(I3)

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

Следует отметить, что предыдущие два этапа могут быть заменены одним этапом с использованием imtophat который сначала вычисляет морфологическое отверстие, а затем вычитает его из исходного изображения.

I2 = imtophat(I,strel('disk',15));

Создайте двоичную версию обработанного изображения, чтобы можно было использовать функции панели инструментов для анализа. Используйте imbinarize функция для преобразования изображения в оттенках серого в двоичное изображение. Удалите фоновый шум из изображения с помощью bwareaopen функция.

bw = imbinarize(I3);
bw = bwareaopen(bw,50);
imshow(bw)

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

Идентификация объектов на изображении

После создания двоичной версии исходного изображения можно выполнить анализ объектов на изображении.

Найдите все подключенные компоненты (объекты) в двоичном изображении. Точность результатов зависит от размера объектов, параметра связности (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)

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

Визуализируйте все связанные компоненты изображения, создавая матрицу меток и отображая ее как псевдоколорное индексированное изображение.

Использовать labelmatrix для создания матрицы меток из выходных данных bwconncomp. Обратите внимание, что labelmatrix сохраняет матрицу меток в наименьшем числовом классе, необходимом для количества объектов.

labeled = labelmatrix(cc);
whos labeled
  Name           Size             Bytes  Class    Attributes

  labeled      256x256            65536  uint8              

Использовать label2rgb чтобы выбрать карту цветов, цвет фона и способ сопоставления объектов в матрице меток с цветами в карте цветов. В псевдоколорном изображении метка, идентифицирующая каждый объект в матрице меток, отображается на другой цвет в связанной матрице карты цветов.

RGB_label = label2rgb(labeled,'spring','c','shuffle');
imshow(RGB_label)

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

Вычислить зональную статистику

Вычислить площадь каждого объекта изображения с помощью 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)

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

Используйте histogram для создания гистограммы площадей рисового зерна.

histogram(grain_areas)
title('Histogram of Rice Grain Area')

Figure contains an axes. The axes with title Histogram of Rice Grain Area contains an object of type histogram.

См. также

| | | | | | | | |