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