Исправьте неоднородное освещение и анализируйте основные объекты

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

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

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

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 labeled
  Name           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 = 95x1 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')

Смотрите также

| | | | | | | | |