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

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

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

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

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.

См. также

| | | | | | | | |