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

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

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

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

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

Figure contains an axes object. The axes object 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 object. The axes object contains an object of type image.

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

I2 = I - background;
imshow(I2)

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

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

I3 = imadjust(I2);
imshow(I3)

Figure contains an axes object. The axes object 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 object. The axes object 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 object. The axes object 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 object. The axes object 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 object. The axes object contains an object of type image.

Используйте histogram команда, чтобы создать гистограмму рисовых гранулярных областей.

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

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

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

| | | | | | | | |